diff options
author | Alan Modra <amodra@gmail.com> | 2017-06-16 19:41:41 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2017-06-16 23:38:28 +0930 |
commit | 7dba9362c172f1073487536eb137feb2da30b0ff (patch) | |
tree | 6dad1f8f6d06e52dd42e155c9ead55e5781af4a8 /ld/emultempl | |
parent | d68f19767dfbb33c1813563d5a4af0731a1855c5 (diff) | |
download | gdb-7dba9362c172f1073487536eb137feb2da30b0ff.zip gdb-7dba9362c172f1073487536eb137feb2da30b0ff.tar.gz gdb-7dba9362c172f1073487536eb137feb2da30b0ff.tar.bz2 |
Rewrite __start and __stop symbol handling
This arranges for __start and __stop symbols to be defined before
garbage collection, for all target formats. That should allow the
COFF and PE --gc-sections to keep a singleton orphan input section,
a feature lost by 2017-06-13 commit cbd0eecf26. The fancier ELF
treatment of keeping all input sections associated with a __start or
__stop symbol, from 2015-10-23 commit 1cce69b9dc, is retained.
.startof. and .sizeof. symbols are deliberately not defined before
garbage collection, so these won't affect garbage collection of
sections.
The patch also ensures __start, __stop, .startof. and .sizeof. symbols
are defined before target size_dynamic_sections is called, albeit
with a preliminary value, so that target code doesn't need to cope
with a symbol changing from undefined at size_dynamic_sections to
defined at relocate_section.
Also, a number of problems with the testcases have been fixed.
PR ld/20022
PR ld/21557
PR ld/21562
PR ld/21571
include/
* bfdlink.h (struct bfd_link_hash_entry): Delete undef.section.
bfd/
* targets.c (struct bfd_target): Add _bfd_define_start_stop.
(BFD_JUMP_TABLE_LINK): Likewise.
* elf-bfd.h (bfd_elf_define_start_stop): Declare.
* elflink.c (_bfd_elf_gc_mark_rsec): Update comment.
(bfd_elf_define_start_stop): New function.
* linker.c (bfd_generic_define_start_stop): New function.
* coff64-rs6000.c (rs6000_xcoff64_vec, rs6000_xcoff64_aix_vec): Init
new field.
* aout-adobe.c (aout_32_bfd_define_start_stop): Define.
* aout-target.h (MY_bfd_define_start_stop): Define.
* aout-tic30.c (MY_bfd_define_start_stop): Define.
* binary.c (binary_bfd_define_start_stop): Define.
* bout.c (b_out_bfd_define_start_stop): Define.
* coff-alpha.c (_bfd_ecoff_bfd_define_start_stop): Define.
* coff-mips.c (_bfd_ecoff_bfd_define_start_stop): Define.
* coff-rs6000.c (_bfd_xcoff_bfd_define_start_stop): Define.
* coffcode.h (coff_bfd_define_start_stop): Define.
* elfxx-target.h (bfd_elfNN_bfd_define_start_stop): Define.
* i386msdos.c (msdos_bfd_define_start_stop): Define.
* i386os9k.c (os9k_bfd_define_start_stop): Define.
* ieee.c (ieee_bfd_define_start_stop): Define.
* ihex.c (ihex_bfd_define_start_stop): Define.
* libbfd-in.h (_bfd_nolink_bfd_define_start_stop): Define.
* mach-o-target.c (bfd_mach_o_bfd_define_start_stop): Define.
* mmo.c (mmo_bfd_define_start_stop): Define.
* nlm-target.h (nlm_bfd_define_start_stop): Define.
* oasys.c (oasys_bfd_define_start_stop): Define.
* pef.c (bfd_pef_bfd_define_start_stop): Define.
* plugin.c (bfd_plugin_bfd_define_start_stop): Define.
* ppcboot.c (ppcboot_bfd_define_start_stop): Define.
* som.c (som_bfd_define_start_stop): Define.
* srec.c (srec_bfd_define_start_stop): Define.
* tekhex.c (tekhex_bfd_define_start_stop): Define.
* versados.c (versados_bfd_define_start_stop): Define.
* vms-alpha.c (vms_bfd_define_start_stop): Define.
(alpha_vms_bfd_define_start_stop): Define.
* xsym.c (bfd_sym_bfd_define_start_stop): Define.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.
ld/
* emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Don't set
__start/__stop syms here.
* ldlang.c (lang_set_startof): Delete.
(start_stop_syms, start_stop_count, start_stop_alloc): New vars.
(lang_define_start_stop, lang_init_start_stop, foreach_start_stop,
undef_start_stop, lang_undef_start_stop, lang_init_startof_sizeof,
set_start_stop, lang_finalize_start_stop): New functions.
(lang_process): Call _start_stop functions.
* testsuite/ld-elf/pr21562a.d: Use xfail rather than notarget.
Correct typos and list of xfail targets.
* testsuite/ld-elf/pr21562b.d: Likewise.
* testsuite/ld-elf/pr21562c.d: Likewise.
* testsuite/ld-elf/pr21562d.d: Likewise.
* testsuite/ld-elf/pr21562e.d: Likewise.
* testsuite/ld-elf/pr21562f.d: Likewise.
* testsuite/ld-elf/pr21562g.d: Likewise.
* testsuite/ld-elf/pr21562h.d: Likewise.
* testsuite/ld-elf/pr21562i.d: Likewise.
* testsuite/ld-elf/pr21562j.d: Likewise.
* testsuite/ld-elf/pr21562k.d: Likewise.
* testsuite/ld-elf/pr21562l.d: Likewise.
* testsuite/ld-elf/pr21562m.d: Likewise.
* testsuite/ld-elf/pr21562n.d: Likewise.
* testsuite/ld-elf/sizeofa.d: Likewise. Adjust to pass for generic ELF.
* testsuite/ld-elf/sizeofb.d: Likewise.
* testsuite/ld-elf/startofa.d: Likewise.
* testsuite/ld-elf/startofb.d: Likewise.
Diffstat (limited to 'ld/emultempl')
-rw-r--r-- | ld/emultempl/elf32.em | 57 |
1 files changed, 0 insertions, 57 deletions
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 9468f7d..325d847 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -1218,7 +1218,6 @@ gld${EMULATION_NAME}_after_open (void) struct elf_link_hash_table *htab; asection *s; bfd *abfd; - char leading_char; after_open_default (); @@ -1277,62 +1276,6 @@ gld${EMULATION_NAME}_after_open (void) return; } - leading_char = bfd_get_symbol_leading_char (link_info.output_bfd); - - /* Check for input sections whose names match references to - __start_SECNAME or __stop_SECNAME symbols. Mark the matched - symbols as hidden and set start_stop for garbage collection. */ - for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next) - for (s = abfd->sections; s; s = s->next) - { - const char *name = bfd_get_section_name (abfd, s); - const char *ps; - - for (ps = name; *ps != '\0'; ps++) - if (!ISALNUM ((unsigned char) *ps) && *ps != '_') - break; - if (*ps == '\0') - { - struct elf_link_hash_entry *h; - char *symbol = (char *) xmalloc (ps - name - + sizeof "__start_" + 1); - - symbol[0] = leading_char; - sprintf (symbol + (leading_char != 0), "__start_%s", name); - h = elf_link_hash_lookup (elf_hash_table (&link_info), - symbol, FALSE, FALSE, TRUE); - if (h != NULL - && (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - && h->u2.start_stop_section == NULL) - { - h->start_stop = 1; - h->u2.start_stop_section = s; - _bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE); - if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL) - h->other = ((h->other & ~ELF_ST_VISIBILITY (-1)) - | STV_HIDDEN); - } - - symbol[0] = leading_char; - sprintf (symbol + (leading_char != 0), "__stop_%s", name); - h = elf_link_hash_lookup (elf_hash_table (&link_info), - symbol, FALSE, FALSE, TRUE); - if (h != NULL - && (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - && h->u2.start_stop_section == NULL) - { - h->start_stop = 1; - h->u2.start_stop_section = s; - _bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE); - if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL) - h->other = ((h->other & ~ELF_ST_VISIBILITY (-1)) - | STV_HIDDEN); - } - } - } - if (!link_info.traditional_format) { bfd *elfbfd = NULL; |