Always keep sections marked with SEC_KEEP
SEC_KEEP check in elf_gc_sweep was missing in commit:
commit bde6f3eb6d
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Fri Jan 8 01:43:23 2010 +0000
Set SEC_KEEP on section XXX for undefined __start_XXX/__stop_XXX
bfd/
2010-01-07 H.J. Lu <hongjiu.lu@intel.com>
PR ld/11133
* elflink.c (_bfd_elf_gc_mark_hook): Check section XXX for
undefined __start_XXX/__stop_XXX in all input files and set
SEC_KEEP.
This patch adds SEC_KEEP check to elf_gc_sweep.
bfd/
PR ld/19161
* elflink.c (elf_gc_sweep): Always keep sections marked with
SEC_KEEP.
ld/testsuite/
PR ld/19161
* ld-gc/gc.exp: Run pr19161 test.
* ld-gc/pr19161-1.c: New file.
* ld-gc/pr19161-2.c: Likewise.
* ld-gc/pr19161.d: Likewise.
This commit is contained in:
parent
d236ad1955
commit
bba037e0ae
7 changed files with 57 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
2015-10-22 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/19161
|
||||
* elflink.c (elf_gc_sweep): Always keep sections marked with
|
||||
SEC_KEEP.
|
||||
|
||||
2015-10-22 Hans-Peter Nilsson <hp@bitrange.com>
|
||||
|
||||
* mmo.c (struct mmo_data_struct): New members
|
||||
|
|
|
@ -12449,7 +12449,8 @@ elf_gc_sweep (bfd *abfd, struct bfd_link_info *info)
|
|||
o->gc_mark = first->gc_mark;
|
||||
}
|
||||
|
||||
if (o->gc_mark)
|
||||
/* Always keep sections marked with SEC_KEEP. */
|
||||
if (o->gc_mark || (o->flags & SEC_KEEP))
|
||||
continue;
|
||||
|
||||
/* Skip sweeping sections already excluded. */
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2015-10-22 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/19161
|
||||
* ld-gc/gc.exp: Run pr19161 test.
|
||||
* ld-gc/pr19161-1.c: New file.
|
||||
* ld-gc/pr19161-2.c: Likewise.
|
||||
* ld-gc/pr19161.d: Likewise.
|
||||
|
||||
2015-10-22 Hans-Peter Nilsson <hp@bitrange.com>
|
||||
|
||||
* ld-scripts/script.exp (extract_symbol_test): Allow nm output of
|
||||
|
|
|
@ -139,3 +139,9 @@ if { [is_remote host] || [which $CC] != 0 } {
|
|||
ld_compile "$CC $CFLAGS $cflags" $srcdir/$subdir/pr14265.c tmpdir/pr14265.o
|
||||
run_dump_test "pr14265"
|
||||
}
|
||||
|
||||
if { [is_remote host] || [which $CC] != 0 } {
|
||||
ld_compile "$CC $CFLAGS $cflags -O0" $srcdir/$subdir/pr19161-1.c tmpdir/pr19161-1.o
|
||||
ld_compile "$CC $CFLAGS $cflags -O0" $srcdir/$subdir/pr19161-2.c tmpdir/pr19161-2.o
|
||||
run_dump_test "pr19161"
|
||||
}
|
||||
|
|
7
ld/testsuite/ld-gc/pr19161-1.c
Normal file
7
ld/testsuite/ld-gc/pr19161-1.c
Normal file
|
@ -0,0 +1,7 @@
|
|||
int (*p)(void);
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return p () != 0x1234;
|
||||
}
|
19
ld/testsuite/ld-gc/pr19161-2.c
Normal file
19
ld/testsuite/ld-gc/pr19161-2.c
Normal file
|
@ -0,0 +1,19 @@
|
|||
int __attribute__((section("my_section"))) a[2] = {0x1234, 0x5678};
|
||||
|
||||
extern int __start_my_section;
|
||||
|
||||
extern int (*p)(void);
|
||||
|
||||
int
|
||||
dump()
|
||||
{
|
||||
int* ap = &__start_my_section;
|
||||
return ap[0];
|
||||
}
|
||||
|
||||
void
|
||||
__attribute__((constructor))
|
||||
foo()
|
||||
{
|
||||
p = dump;
|
||||
}
|
9
ld/testsuite/ld-gc/pr19161.d
Normal file
9
ld/testsuite/ld-gc/pr19161.d
Normal file
|
@ -0,0 +1,9 @@
|
|||
#name: --gc-sections with __start_SECTIONNAME
|
||||
#source: dummy.s
|
||||
#ld: --gc-sections -e main tmpdir/pr19161-1.o tmpdir/pr19161-2.o
|
||||
#nm: --format=bsd
|
||||
#xfail: sh64*-*-* iq2000-*-* lm32-*-* epiphany-*-* mips64vr-*-* frv-*-* m32c-*-* rl78-*-* rx-*-* sh-*-* powerpc*-*-eabivle msp430-*-*
|
||||
|
||||
#...
|
||||
0*[1-9a-f]+[0-9a-f]*[ ](D)[ ]_*__start_my_section
|
||||
#...
|
Loading…
Reference in a new issue