diff options
-rw-r--r-- | bfd/ChangeLog | 20 | ||||
-rw-r--r-- | bfd/bfd-in.h | 6 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 6 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 171 | ||||
-rw-r--r-- | bfd/elflink.c | 59 | ||||
-rw-r--r-- | ld/ChangeLog | 30 | ||||
-rw-r--r-- | ld/emulparams/elf32ppc.sh | 11 | ||||
-rw-r--r-- | ld/emultempl/aix.em | 1 | ||||
-rw-r--r-- | ld/emultempl/armcoff.em | 1 | ||||
-rw-r--r-- | ld/emultempl/beos.em | 1 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 45 | ||||
-rw-r--r-- | ld/emultempl/generic.em | 1 | ||||
-rw-r--r-- | ld/emultempl/gld960.em | 1 | ||||
-rw-r--r-- | ld/emultempl/gld960c.em | 1 | ||||
-rw-r--r-- | ld/emultempl/linux.em | 1 | ||||
-rw-r--r-- | ld/emultempl/lnk960.em | 1 | ||||
-rw-r--r-- | ld/emultempl/m68kcoff.em | 1 | ||||
-rw-r--r-- | ld/emultempl/pe.em | 1 | ||||
-rw-r--r-- | ld/emultempl/ppc32elf.em | 18 | ||||
-rw-r--r-- | ld/emultempl/sunos.em | 1 | ||||
-rw-r--r-- | ld/emultempl/ticoff.em | 1 | ||||
-rw-r--r-- | ld/emultempl/vanilla.em | 1 | ||||
-rw-r--r-- | ld/ldemul.c | 11 | ||||
-rw-r--r-- | ld/ldemul.h | 7 | ||||
-rw-r--r-- | ld/ldlang.c | 5 | ||||
-rw-r--r-- | ld/scripttempl/elf.sc | 30 |
26 files changed, 190 insertions, 242 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 98fb936..3854c21 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,25 @@ 2005-08-04 Alan Modra <amodra@bigpond.net.au> + * elf32-ppc.c (struct elf_linker_section): Replace sym_val field + with sym. + (ppc_elf_relocate_section): Adjust for above. + (create_sdata_sym): New function. + (ppc_elf_create_linker_section): Call it. + (ppc_elf_check_relocs): Correct has_sda_refs and non_got_refs. + Create sdata syms for all SDA relocs. + (ppc_elf_adjust_dynamic_symbol): Don't special case _SDA_BASE_ + and _SDA2_BASE_. + (ppc_elf_set_sdata_syms): Delete. + * elflink.c (bfd_elf_size_dynamic_sections): Don't create DT_INIT + and DT_FINI tags unless associated section has input. + (bfd_elf_set_symbol, _bfd_elf_provide_symbol): Delete. + (_bfd_elf_provide_section_bound_symbols): Delete. + * bfd-in.h (_bfd_elf_provide_symbol): Delete. + (_bfd_elf_provide_section_bound_symbols): Delete. + * bfd-in2.h: Regenerate. + +2005-08-04 Alan Modra <amodra@bigpond.net.au> + * elflink.c (fix_syms, _bfd_elf_fix_excluded_sec_syms): Move to.. * linker.c (fix_syms, _bfd_fix_excluded_sec_syms): ..here. * bfd-in.h (_bfd_fix_excluded_sec_syms): Rename. diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 39a82cb..cd3bc76 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -702,12 +702,6 @@ extern int bfd_get_sign_extend_vma extern struct bfd_section *_bfd_elf_tls_setup (bfd *, struct bfd_link_info *); -extern void _bfd_elf_provide_symbol - (struct bfd_link_info *, const char *, bfd_vma, struct bfd_section *); - -extern void _bfd_elf_provide_section_bound_symbols - (struct bfd_link_info *, struct bfd_section *, const char *, const char *); - extern void _bfd_fix_excluded_sec_syms (bfd *, struct bfd_link_info *); diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 50ac263..8ca1d6f 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -709,12 +709,6 @@ extern int bfd_get_sign_extend_vma extern struct bfd_section *_bfd_elf_tls_setup (bfd *, struct bfd_link_info *); -extern void _bfd_elf_provide_symbol - (struct bfd_link_info *, const char *, bfd_vma, struct bfd_section *); - -extern void _bfd_elf_provide_section_bound_symbols - (struct bfd_link_info *, struct bfd_section *, const char *, const char *); - extern void _bfd_fix_excluded_sec_syms (bfd *, struct bfd_link_info *); diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 5f51a3a..168e58c 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -1668,8 +1668,8 @@ typedef struct elf_linker_section const char *bss_name; /* Associated symbol name. */ const char *sym_name; - /* Value of symbol. */ - bfd_vma sym_val; + /* Associated symbol. */ + struct elf_link_hash_entry *sym; } elf_linker_section_t; /* Linked list of allocated pointer entries. This hangs off of the @@ -2734,6 +2734,20 @@ ppc_elf_add_symbol_hook (bfd *abfd, return TRUE; } +static bfd_boolean +create_sdata_sym (struct ppc_elf_link_hash_table *htab, + elf_linker_section_t *lsect) +{ + lsect->sym = elf_link_hash_lookup (&htab->elf, lsect->sym_name, + TRUE, FALSE, TRUE); + if (lsect->sym == NULL) + return FALSE; + if (lsect->sym->root.type == bfd_link_hash_new) + lsect->sym->non_elf = 0; + lsect->sym->ref_regular = 1; + return TRUE; +} + /* Create a special linker section. */ static bfd_boolean @@ -2760,7 +2774,7 @@ ppc_elf_create_linker_section (bfd *abfd, return FALSE; lsect->section = s; - return TRUE; + return create_sdata_sym (htab, lsect); } /* Find a linker generated pointer with a given addend and type. */ @@ -3090,6 +3104,11 @@ ppc_elf_check_relocs (bfd *abfd, if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0], h, rel)) return FALSE; + if (h != NULL) + { + ppc_elf_hash_entry (h)->has_sda_refs = TRUE; + h->non_got_ref = TRUE; + } break; /* Indirect .sdata2 relocation. */ @@ -3106,12 +3125,65 @@ ppc_elf_check_relocs (bfd *abfd, if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1], h, rel)) return FALSE; + if (h != NULL) + { + ppc_elf_hash_entry (h)->has_sda_refs = TRUE; + h->non_got_ref = TRUE; + } break; case R_PPC_SDAREL16: + if (info->shared) + { + bad_shared_reloc (abfd, r_type); + return FALSE; + } + if (htab->sdata[0].sym == NULL + && !create_sdata_sym (htab, &htab->sdata[0])) + return FALSE; + if (h != NULL) + { + ppc_elf_hash_entry (h)->has_sda_refs = TRUE; + h->non_got_ref = TRUE; + } + break; + case R_PPC_EMB_SDA2REL: + if (info->shared) + { + bad_shared_reloc (abfd, r_type); + return FALSE; + } + if (htab->sdata[1].sym == NULL + && !create_sdata_sym (htab, &htab->sdata[1])) + return FALSE; + if (h != NULL) + { + ppc_elf_hash_entry (h)->has_sda_refs = TRUE; + h->non_got_ref = TRUE; + } + break; + case R_PPC_EMB_SDA21: case R_PPC_EMB_RELSDA: + if (info->shared) + { + bad_shared_reloc (abfd, r_type); + return FALSE; + } + if (htab->sdata[0].sym == NULL + && !create_sdata_sym (htab, &htab->sdata[0])) + return FALSE; + if (htab->sdata[1].sym == NULL + && !create_sdata_sym (htab, &htab->sdata[1])) + return FALSE; + if (h != NULL) + { + ppc_elf_hash_entry (h)->has_sda_refs = TRUE; + h->non_got_ref = TRUE; + } + break; + case R_PPC_EMB_NADDR32: case R_PPC_EMB_NADDR16: case R_PPC_EMB_NADDR16_LO: @@ -3123,11 +3195,7 @@ ppc_elf_check_relocs (bfd *abfd, return FALSE; } if (h != NULL) - { - ppc_elf_hash_entry (h)->has_sda_refs = TRUE; - /* We may need a copy reloc. */ - h->non_got_ref = TRUE; - } + h->non_got_ref = TRUE; break; case R_PPC_PLT32: @@ -4046,24 +4114,6 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info, /* This is a reference to a symbol defined by a dynamic object which is not a function. */ - /* First, a fudge for old shared libs that export some symbols they - should not. */ - if (!h->def_regular - && (strcmp (h->root.root.string, "_SDA_BASE_") == 0 - || strcmp (h->root.root.string, "_SDA2_BASE_") == 0)) - { - /* These symbols will be defined later, as if they were defined in - a linker script. We don't want to use a definition in a shared - object. */ - const struct elf_backend_data *bed; - - bed = get_elf_backend_data (htab->elf.dynobj); - (*bed->elf_backend_hide_symbol) (info, h, TRUE); - h->root.type = bfd_link_hash_undefined; - h->root.u.undef.abfd = htab->elf.dynobj; - return TRUE; - } - /* If we are creating a shared library, we must presume that the only references to the symbol are via the global offset table. For such cases we need not do anything here; the relocations will @@ -5259,52 +5309,6 @@ ppc_elf_relax_section (bfd *abfd, return FALSE; } -/* Set _SDA_BASE_, _SDA2_BASE, and sbss start and end syms. They are - set here rather than via PROVIDE in the default linker script, - because using PROVIDE inside an output section statement results in - unnecessary output sections. Using PROVIDE outside an output section - statement runs the risk of section alignment affecting where the - section starts. */ - -void -ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info) -{ - struct ppc_elf_link_hash_table *htab; - unsigned i; - asection *s; - bfd_vma val; - - htab = ppc_elf_hash_table (info); - - for (i = 0; i < 2; i++) - { - elf_linker_section_t *lsect = &htab->sdata[i]; - - s = lsect->section; - if (s != NULL) - s = s->output_section; - if (s == NULL) - s = bfd_get_section_by_name (obfd, lsect->name); - if (s == NULL) - s = bfd_get_section_by_name (obfd, lsect->bss_name); - - if (s) - { - /* VxWorks executables are relocatable, so the sdata base symbols - must be section-relative. */ - val = 32768; - lsect->sym_val = val + s->vma; - } - else - { - val = 0; - lsect->sym_val = 0; - } - - _bfd_elf_provide_symbol (info, lsect->sym_name, val, s); - } -} - /* What to do when ld finds relocations against symbols defined in discarded sections. */ @@ -6348,6 +6352,7 @@ ppc_elf_relocate_section (bfd *output_bfd, case R_PPC_SDAREL16: { const char *name; + struct elf_link_hash_entry *sh; BFD_ASSERT (sec != NULL); name = bfd_get_section_name (abfd, sec->output_section); @@ -6364,7 +6369,10 @@ ppc_elf_relocate_section (bfd *output_bfd, howto->name, name); } - addend -= htab->sdata[0].sym_val; + sh = htab->sdata[0].sym; + addend -= (sh->root.u.def.value + + sh->root.u.def.section->output_offset + + sh->root.u.def.section->output_section->vma); } break; @@ -6372,6 +6380,7 @@ ppc_elf_relocate_section (bfd *output_bfd, case R_PPC_EMB_SDA2REL: { const char *name; + struct elf_link_hash_entry *sh; BFD_ASSERT (sec != NULL); name = bfd_get_section_name (abfd, sec->output_section); @@ -6390,7 +6399,10 @@ ppc_elf_relocate_section (bfd *output_bfd, ret = FALSE; continue; } - addend -= htab->sdata[1].sym_val; + sh = htab->sdata[1].sym; + addend -= (sh->root.u.def.value + + sh->root.u.def.section->output_offset + + sh->root.u.def.section->output_section->vma); } break; @@ -6400,6 +6412,7 @@ ppc_elf_relocate_section (bfd *output_bfd, { const char *name; int reg; + struct elf_link_hash_entry *sh; BFD_ASSERT (sec != NULL); name = bfd_get_section_name (abfd, sec->output_section); @@ -6409,14 +6422,20 @@ ppc_elf_relocate_section (bfd *output_bfd, && (name[5] == 0 || name[5] == '.')))) { reg = 13; - addend -= htab->sdata[0].sym_val; + sh = htab->sdata[0].sym; + addend -= (sh->root.u.def.value + + sh->root.u.def.section->output_offset + + sh->root.u.def.section->output_section->vma); } else if (strncmp (name, ".sdata2", 7) == 0 || strncmp (name, ".sbss2", 6) == 0) { reg = 2; - addend -= htab->sdata[1].sym_val; + sh = htab->sdata[1].sym; + addend -= (sh->root.u.def.value + + sh->root.u.def.section->output_offset + + sh->root.u.def.section->output_section->vma); } else if (strcmp (name, ".PPC.EMB.sdata0") == 0 diff --git a/bfd/elflink.c b/bfd/elflink.c index 457ba8e..7b7cddd 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -5032,6 +5032,7 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, asection *dynstr; struct bfd_elf_version_tree *t; struct bfd_elf_version_expr *d; + asection *s; bfd_boolean all_defined; *sinterpptr = bfd_get_section_by_name (dynobj, ".interp"); @@ -5235,7 +5236,8 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, return FALSE; } - if (bfd_get_section_by_name (output_bfd, ".preinit_array") != NULL) + s = bfd_get_section_by_name (output_bfd, ".preinit_array"); + if (s != NULL && s->linker_has_input) { /* DT_PREINIT_ARRAY is not allowed in shared library. */ if (! info->executable) @@ -5263,13 +5265,15 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, || !_bfd_elf_add_dynamic_entry (info, DT_PREINIT_ARRAYSZ, 0)) return FALSE; } - if (bfd_get_section_by_name (output_bfd, ".init_array") != NULL) + s = bfd_get_section_by_name (output_bfd, ".init_array"); + if (s != NULL && s->linker_has_input) { if (!_bfd_elf_add_dynamic_entry (info, DT_INIT_ARRAY, 0) || !_bfd_elf_add_dynamic_entry (info, DT_INIT_ARRAYSZ, 0)) return FALSE; } - if (bfd_get_section_by_name (output_bfd, ".fini_array") != NULL) + s = bfd_get_section_by_name (output_bfd, ".fini_array"); + if (s != NULL && s->linker_has_input) { if (!_bfd_elf_add_dynamic_entry (info, DT_FINI_ARRAY, 0) || !_bfd_elf_add_dynamic_entry (info, DT_FINI_ARRAYSZ, 0)) @@ -9841,55 +9845,6 @@ _bfd_elf_section_already_linked (bfd *abfd, struct bfd_section * sec) bfd_section_already_linked_table_insert (already_linked_list, sec); } -static void -bfd_elf_set_symbol (struct elf_link_hash_entry *h, bfd_vma val, - struct bfd_section *s) -{ - h->root.type = bfd_link_hash_defined; - h->root.u.def.section = s ? s : bfd_abs_section_ptr; - h->root.u.def.value = val; - h->def_regular = 1; - h->type = STT_OBJECT; - h->other = STV_HIDDEN | (h->other & ~ ELF_ST_VISIBILITY (-1)); - h->forced_local = 1; -} - -/* Set NAME to VAL if the symbol exists and is not defined in a regular - object file. If S is NULL it is an absolute symbol, otherwise it is - relative to that section. */ - -void -_bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name, - bfd_vma val, struct bfd_section *s) -{ - struct elf_link_hash_entry *h; - - bfd_elf_record_link_assignment (info, name, TRUE); - - h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE); - if (h != NULL - && !(h->root.type == bfd_link_hash_defined - && h->root.u.def.section != NULL - && h->root.u.def.section != h->root.u.def.section->output_section)) - bfd_elf_set_symbol (h, val, s); -} - -/* Set START and END to boundaries of SEC if they exist and are not - defined in regular object files. */ - -void -_bfd_elf_provide_section_bound_symbols (struct bfd_link_info *info, - asection *sec, - const char *start, - const char *end) -{ - bfd_vma val = 0; - _bfd_elf_provide_symbol (info, start, val, sec); - if (sec != NULL) - val = sec->size; - _bfd_elf_provide_symbol (info, end, val, sec); -} - bfd_boolean _bfd_elf_common_definition (Elf_Internal_Sym *sym) { diff --git a/ld/ChangeLog b/ld/ChangeLog index de94006..907208f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,35 @@ 2005-08-04 Alan Modra <amodra@bigpond.net.au> + * ldemul.c (ldemul_do_assignments, do_assignments_default): Delete. + * ldemul.h (ldemul_do_assignments, do_assignments_default): Delete. + (struct ld_emulation_xfer_struct): Remove do_assignments field. + * ldlang.c (lang_do_assignments): Don't call ldemul_do_assignments. + * emulparams/elf32ppc.sh (SDATA_START_SYMBOLS): New. + (SDATA2_START_SYMBOLS, SBSS_START_SYMBOLS, SBSS_END_SYMBOLS): New. + * emultempl/aix.em (ld_*_emulation): Delete do_assignments init. + * emultempl/armcoff.em: Likewise. + * emultempl/beos.em: Likewise. + * emultempl/generic.em: Likewise. + * emultempl/gld960.em: Likewise. + * emultempl/gld960c.em: Likewise. + * emultempl/linux.em: Likewise. + * emultempl/lnk960.em: Likewise. + * emultempl/m68kcoff.em: Likewise. + * emultempl/pe.em: Likewise. + * emultempl/sunos.em: Likewise. + * emultempl/ticoff.em: Likewise. + * emultempl/vanilla.em: Likewise. + * emultempl/elf32.em: Likewise. + (gld*_provide_bound_symbols): Delete. + (gld*_provide_init_fini_syms): Delete. + (gld*_before_allocation): Don't call ldemul_do_assignments. + * emultempl/ppc32elf.em (ppc_do_assignments): Delete. + (LDEMUL_DO_ASSIGNMENTS): Delete. + * scripttempl/elf.sc: Provide init/fini syms. Add SBSS_START_SYMBOLS, + SBSS_END_SYMBOLS, SDATA2_START_SYMBOLS. + +2005-08-04 Alan Modra <amodra@bigpond.net.au> + * Makefile.am (eelf32m32c.c): Fix dependencies. * Makefile.in: Regenerate. diff --git a/ld/emulparams/elf32ppc.sh b/ld/emulparams/elf32ppc.sh index e5b2252..ad6876d 100644 --- a/ld/emulparams/elf32ppc.sh +++ b/ld/emulparams/elf32ppc.sh @@ -23,6 +23,17 @@ PLT=".plt ${RELOCATING-0} : SPECIAL { *(.plt) }" GOTPLT="${PLT}" OTHER_TEXT_SECTIONS="*(.glink)" EXECUTABLE_SYMBOLS='PROVIDE (__stack = 0); PROVIDE (___stack = 0);' +if test -z "${CREATE_SHLIB}"; then + SDATA_START_SYMBOLS="PROVIDE (_SDA_BASE_ = 32768);" + SDATA2_START_SYMBOLS="PROVIDE (_SDA2_BASE_ = 32768);" + SBSS_START_SYMBOLS="PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .);" + SBSS_END_SYMBOLS="PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .);" +else + unset SDATA_START_SYMBOLS + unset SDATA2_START_SYMBOLS + unset SBSS_START_SYMBOLS + unset SBSS_END_SYMBOLS +fi OTHER_END_SYMBOLS="__end = .;" OTHER_RELRO_SECTIONS=" .fixup ${RELOCATING-0} : { *(.fixup) } diff --git a/ld/emultempl/aix.em b/ld/emultempl/aix.em index 8763155..d525edd 100644 --- a/ld/emultempl/aix.em +++ b/ld/emultempl/aix.em @@ -1339,7 +1339,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = { gld${EMULATION_NAME}_set_output_arch, gld${EMULATION_NAME}_choose_target, gld${EMULATION_NAME}_before_allocation, - do_assignments_default, gld${EMULATION_NAME}_get_script, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/armcoff.em b/ld/emultempl/armcoff.em index acf117c..d5fd67d 100644 --- a/ld/emultempl/armcoff.em +++ b/ld/emultempl/armcoff.em @@ -261,7 +261,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = set_output_arch_default, ldemul_default_target, gld${EMULATION_NAME}_before_allocation, - do_assignments_default, gld${EMULATION_NAME}_get_script, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/beos.em b/ld/emultempl/beos.em index e07677b..0b06bc7 100644 --- a/ld/emultempl/beos.em +++ b/ld/emultempl/beos.em @@ -766,7 +766,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = set_output_arch_default, ldemul_default_target, gld_${EMULATION_NAME}_before_allocation, - do_assignments_default, gld_${EMULATION_NAME}_get_script, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index e43c8c5..2764a59 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -57,7 +57,6 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. /* Declare functions used by various EXTRA_EM_FILEs. */ static void gld${EMULATION_NAME}_before_parse (void); static void gld${EMULATION_NAME}_after_open (void); -static void gld${EMULATION_NAME}_provide_init_fini_syms (void); static void gld${EMULATION_NAME}_before_allocation (void); static bfd_boolean gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s); @@ -1040,47 +1039,6 @@ if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; fi cat >>e${EMULATION_NAME}.c <<EOF -static void -gld${EMULATION_NAME}_provide_bound_symbols (const char *sec, - const char *start, - const char *end) -{ - asection *s = bfd_get_section_by_name (output_bfd, sec); - _bfd_elf_provide_section_bound_symbols (&link_info, s, start, end); -} - -/* If not building a shared library, provide - - __preinit_array_start - __preinit_array_end - __init_array_start - __init_array_end - __fini_array_start - __fini_array_end - - They are set here rather than via PROVIDE in the linker - script, because using PROVIDE inside an output section - statement results in unnecessary output sections. Using - PROVIDE outside an output section statement runs the risk of - section alignment affecting where the section starts. */ - -static void -gld${EMULATION_NAME}_provide_init_fini_syms (void) -{ - if (!link_info.relocatable && link_info.executable) - { - gld${EMULATION_NAME}_provide_bound_symbols (".preinit_array", - "__preinit_array_start", - "__preinit_array_end"); - gld${EMULATION_NAME}_provide_bound_symbols (".init_array", - "__init_array_start", - "__init_array_end"); - gld${EMULATION_NAME}_provide_bound_symbols (".fini_array", - "__fini_array_start", - "__fini_array_end"); - } -} - /* This is called after the sections have been attached to output sections, but before any sizes or addresses have been set. */ @@ -1098,8 +1056,6 @@ gld${EMULATION_NAME}_before_allocation (void) referred to by dynamic objects. */ lang_for_each_statement (gld${EMULATION_NAME}_find_statement_assignment); - ldemul_do_assignments (); - /* Let the ELF backend work out the sizes of any sections required by dynamic linking. */ rpath = command_line.rpath; @@ -1881,7 +1837,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default}, ${LDEMUL_CHOOSE_TARGET-ldemul_default_target}, ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation}, - ${LDEMUL_DO_ASSIGNMENTS-gld${EMULATION_NAME}_provide_init_fini_syms}, ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script}, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/generic.em b/ld/emultempl/generic.em index f7153b6..985cdf8 100644 --- a/ld/emultempl/generic.em +++ b/ld/emultempl/generic.em @@ -128,7 +128,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default}, ${LDEMUL_CHOOSE_TARGET-ldemul_default_target}, ${LDEMUL_BEFORE_ALLOCATION-before_allocation_default}, - ${LDEMUL_DO_ASSIGNMENTS-do_assignments_default}, ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script}, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/gld960.em b/ld/emultempl/gld960.em index f407622..63b5bb3 100644 --- a/ld/emultempl/gld960.em +++ b/ld/emultempl/gld960.em @@ -134,7 +134,6 @@ struct ld_emulation_xfer_struct ld_gld960_emulation = gld960_set_output_arch, gld960_choose_target, before_allocation_default, - do_assignments_default, gld960_get_script, "960", "", diff --git a/ld/emultempl/gld960c.em b/ld/emultempl/gld960c.em index 5de01e6..6973a06 100644 --- a/ld/emultempl/gld960c.em +++ b/ld/emultempl/gld960c.em @@ -149,7 +149,6 @@ struct ld_emulation_xfer_struct ld_gld960coff_emulation = gld960_set_output_arch, gld960_choose_target, before_allocation_default, - do_assignments_default, gld960_get_script, "960coff", "", diff --git a/ld/emultempl/linux.em b/ld/emultempl/linux.em index 071af80..996a7ea 100644 --- a/ld/emultempl/linux.em +++ b/ld/emultempl/linux.em @@ -189,7 +189,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = set_output_arch_default, ldemul_default_target, gld${EMULATION_NAME}_before_allocation, - do_assignments_default, gld${EMULATION_NAME}_get_script, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/lnk960.em b/ld/emultempl/lnk960.em index 1483983..95384d4 100644 --- a/ld/emultempl/lnk960.em +++ b/ld/emultempl/lnk960.em @@ -269,7 +269,6 @@ struct ld_emulation_xfer_struct ld_lnk960_emulation = lnk960_set_output_arch, lnk960_choose_target, before_allocation_default, - do_assignments_default, lnk960_get_script, "lnk960", "", diff --git a/ld/emultempl/m68kcoff.em b/ld/emultempl/m68kcoff.em index 31f98a0..4bf3994 100644 --- a/ld/emultempl/m68kcoff.em +++ b/ld/emultempl/m68kcoff.em @@ -222,7 +222,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = set_output_arch_default, ldemul_default_target, before_allocation_default, - do_assignments_default, gld${EMULATION_NAME}_get_script, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 6e14330..df7692d 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -1823,7 +1823,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = set_output_arch_default, ldemul_default_target, gld_${EMULATION_NAME}_before_allocation, - do_assignments_default, gld_${EMULATION_NAME}_get_script, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/ppc32elf.em b/ld/emultempl/ppc32elf.em index ba59b80..e4d56de 100644 --- a/ld/emultempl/ppc32elf.em +++ b/ld/emultempl/ppc32elf.em @@ -117,23 +117,6 @@ ppc_before_allocation (void) gld${EMULATION_NAME}_before_allocation (); } -static void -ppc_do_assignments (void) -{ - asection *s; - - if (is_ppc_elf32_vec (link_info.hash->creator)) - ppc_elf_set_sdata_syms (output_bfd, &link_info); - - s = bfd_get_section_by_name (output_bfd, ".sbss"); - _bfd_elf_provide_section_bound_symbols (&link_info, s, - "__sbss_start", "__sbss_end"); - _bfd_elf_provide_section_bound_symbols (&link_info, s, - "___sbss_start", "___sbss_end"); - - gld${EMULATION_NAME}_provide_init_fini_syms (); -} - EOF # Define some shell vars to insert bits of code into the standard elf @@ -177,4 +160,3 @@ PARSE_AND_LIST_ARGS_CASES=' # LDEMUL_AFTER_OPEN=ppc_after_open LDEMUL_BEFORE_ALLOCATION=ppc_before_allocation -LDEMUL_DO_ASSIGNMENTS=ppc_do_assignments diff --git a/ld/emultempl/sunos.em b/ld/emultempl/sunos.em index 19f1893..a480558 100644 --- a/ld/emultempl/sunos.em +++ b/ld/emultempl/sunos.em @@ -1013,7 +1013,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = set_output_arch_default, ldemul_default_target, gld${EMULATION_NAME}_before_allocation, - do_assignments_default, gld${EMULATION_NAME}_get_script, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/ticoff.em b/ld/emultempl/ticoff.em index 5938ba4..0382bbd 100644 --- a/ld/emultempl/ticoff.em +++ b/ld/emultempl/ticoff.em @@ -162,7 +162,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = set_output_arch_default, ldemul_default_target, before_allocation_default, - do_assignments_default, gld_${EMULATION_NAME}_get_script, "${EMULATION_NAME}", "${OUTPUT_FORMAT}", diff --git a/ld/emultempl/vanilla.em b/ld/emultempl/vanilla.em index ad11f41..2124852 100644 --- a/ld/emultempl/vanilla.em +++ b/ld/emultempl/vanilla.em @@ -65,7 +65,6 @@ struct ld_emulation_xfer_struct ld_vanilla_emulation = vanilla_set_output_arch, ldemul_default_target, before_allocation_default, - do_assignments_default, vanilla_get_script, "vanilla", "a.out-sunos-big", diff --git a/ld/ldemul.c b/ld/ldemul.c index 5b4796a..0ff11ce 100644 --- a/ld/ldemul.c +++ b/ld/ldemul.c @@ -80,12 +80,6 @@ ldemul_before_allocation (void) } void -ldemul_do_assignments (void) -{ - ld_emulation->do_assignments (); -} - -void ldemul_set_output_arch (void) { ld_emulation->set_output_arch (); @@ -222,11 +216,6 @@ before_allocation_default (void) } void -do_assignments_default (void) -{ -} - -void finish_default (void) { if (!link_info.relocatable) diff --git a/ld/ldemul.h b/ld/ldemul.h index c3ba033..44538d1 100644 --- a/ld/ldemul.h +++ b/ld/ldemul.h @@ -35,8 +35,6 @@ extern void ldemul_after_allocation (void); extern void ldemul_before_allocation (void); -extern void ldemul_do_assignments - (void); extern void ldemul_set_output_arch (void); extern char *ldemul_choose_target @@ -79,7 +77,7 @@ extern void after_allocation_default (void); extern void before_allocation_default (void); -extern void do_assignments_default +extern void finish_default (void); extern void finish_default (void); @@ -123,9 +121,6 @@ typedef struct ld_emulation_xfer_struct { /* Run before allocating output sections. */ void (*before_allocation) (void); - /* Run to set special symbols at the same time as link script syms. */ - void (*do_assignments) (void); - /* Return the appropriate linker script. */ char * (*get_script) (int *isfile); diff --git a/ld/ldlang.c b/ld/ldlang.c index 038af17..fb5454c 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -3056,9 +3056,7 @@ strip_excluded_output_sections (void) { lang_output_section_statement_type *os; - /* Run lang_size_sections (if not already done) to ensure that all - symbols defined in the linker script are put in the bfd hash - table. */ + /* Run lang_size_sections (if not already done). */ if (expld.phase != lang_mark_phase_enum) { expld.phase = lang_mark_phase_enum; @@ -4591,7 +4589,6 @@ lang_do_assignments (void) { lang_statement_iteration++; lang_do_assignments_1 (statement_list.head, abs_output_section, NULL, 0); - ldemul_do_assignments (); } /* Fix any .startof. or .sizeof. symbols. When the assemblers see the diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc index 741d529..3ee8b43 100644 --- a/ld/scripttempl/elf.sc +++ b/ld/scripttempl/elf.sc @@ -123,10 +123,12 @@ STACKNOTE="/DISCARD/ : { *(.note.GNU-stack) }" if test -z "${NO_SMALL_DATA}"; then SBSS=".sbss ${RELOCATING-0} : { + ${RELOCATING+${SBSS_START_SYMBOLS}} ${CREATE_SHLIB+*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)} *(.dynsbss) *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*}) *(.scommon) + ${RELOCATING+${SBSS_END_SYMBOLS}} }" SBSS2=".sbss2 ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) }" SDATA="/* We want the small data sections together, so single-instruction offsets @@ -138,7 +140,11 @@ if test -z "${NO_SMALL_DATA}"; then ${CREATE_SHLIB+*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)} *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*}) }" - SDATA2=".sdata2 ${RELOCATING-0} : { *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*}) }" + SDATA2=".sdata2 ${RELOCATING-0} : + { + ${RELOCATING+${SDATA2_START_SYMBOLS}} + *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*}) + }" REL_SDATA=".rel.sdata ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) } .rela.sdata ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }" REL_SBSS=".rel.sbss ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) } @@ -376,10 +382,24 @@ cat <<EOF .tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) } .tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} } - .preinit_array ${RELOCATING-0} : { KEEP (*(.preinit_array)) } - .init_array ${RELOCATING-0} : { KEEP (*(.init_array)) } - .fini_array ${RELOCATING-0} : { KEEP (*(.fini_array)) } - + .preinit_array ${RELOCATING-0} : + { + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_start = .);}} + KEEP (*(.preinit_array)) + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__preinit_array_end = .);}} + } + .init_array ${RELOCATING-0} : + { + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_start = .);}} + KEEP (*(.init_array)) + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__init_array_end = .);}} + } + .fini_array ${RELOCATING-0} : + { + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_start = .);}} + KEEP (*(.fini_array)) + ${RELOCATING+${CREATE_SHLIB-PROVIDE (__fini_array_end = .);}} + } ${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}} ${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}} .jcr ${RELOCATING-0} : { KEEP (*(.jcr)) } |