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. ld/testsuite/ 2010-01-07 H.J. Lu <hongjiu.lu@intel.com> PR ld/11133 * ld-gc/gc.exp: Run start. * ld-gc/start.d: New. * ld-gc/start.s: Likewise.
This commit is contained in:
parent
b903363e43
commit
bde6f3eb6d
@ -1,3 +1,10 @@
|
||||
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.
|
||||
|
||||
2010-01-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/11143
|
||||
|
@ -11331,6 +11331,8 @@ _bfd_elf_gc_mark_hook (asection *sec,
|
||||
struct elf_link_hash_entry *h,
|
||||
Elf_Internal_Sym *sym)
|
||||
{
|
||||
const char *sec_name;
|
||||
|
||||
if (h != NULL)
|
||||
{
|
||||
switch (h->root.type)
|
||||
@ -11342,6 +11344,33 @@ _bfd_elf_gc_mark_hook (asection *sec,
|
||||
case bfd_link_hash_common:
|
||||
return h->root.u.c.p->section;
|
||||
|
||||
case bfd_link_hash_undefined:
|
||||
case bfd_link_hash_undefweak:
|
||||
/* To work around a glibc bug, keep all XXX input sections
|
||||
when there is an as yet undefined reference to __start_XXX
|
||||
or __stop_XXX symbols. The linker will later define such
|
||||
symbols for orphan input sections that have a name
|
||||
representable as a C identifier. */
|
||||
if (strncmp (h->root.root.string, "__start_", 8) == 0)
|
||||
sec_name = h->root.root.string + 8;
|
||||
else if (strncmp (h->root.root.string, "__stop_", 7) == 0)
|
||||
sec_name = h->root.root.string + 7;
|
||||
else
|
||||
sec_name = NULL;
|
||||
|
||||
if (sec_name && *sec_name != '\0')
|
||||
{
|
||||
bfd *i;
|
||||
|
||||
for (i = info->input_bfds; i; i = i->link_next)
|
||||
{
|
||||
sec = bfd_get_section_by_name (i, sec_name);
|
||||
if (sec)
|
||||
sec->flags |= SEC_KEEP;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1,3 +1,11 @@
|
||||
2010-01-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/11133
|
||||
* ld-gc/gc.exp: Run start.
|
||||
|
||||
* ld-gc/start.d: New.
|
||||
* ld-gc/start.s: Likewise.
|
||||
|
||||
2010-01-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/11143
|
||||
|
@ -91,3 +91,4 @@ test_gc "Check --gc-section/-r/-u" "gcrel" $ld "-r --gc-sections -u used_func"
|
||||
|
||||
run_dump_test "noent"
|
||||
run_dump_test "abi-note"
|
||||
run_dump_test "start"
|
||||
|
8
ld/testsuite/ld-gc/start.d
Normal file
8
ld/testsuite/ld-gc/start.d
Normal file
@ -0,0 +1,8 @@
|
||||
#name: --gc-sections with __start_
|
||||
#ld: --gc-sections -e _start
|
||||
#nm: -n
|
||||
#target: *-*-linux*
|
||||
|
||||
#...
|
||||
[0-9a-f]+ A +__start__foo
|
||||
#...
|
6
ld/testsuite/ld-gc/start.s
Normal file
6
ld/testsuite/ld-gc/start.s
Normal file
@ -0,0 +1,6 @@
|
||||
.globl _start
|
||||
_start:
|
||||
.long __start__foo
|
||||
.section _foo,"aw",%progbits
|
||||
foo:
|
||||
.long 1
|
Loading…
x
Reference in New Issue
Block a user