diff options
author | Alan Modra <amodra@gmail.com> | 2005-08-04 06:22:14 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2005-08-04 06:22:14 +0000 |
commit | 046183de0ebe379c1ec11188000bb6e0f64a9e0e (patch) | |
tree | 3eb7034b61e33a4305933aeca12fda76ab10f662 /bfd/elflink.c | |
parent | fa498e09475dc0fc2d6e12f440f3f38df470100a (diff) | |
download | gdb-046183de0ebe379c1ec11188000bb6e0f64a9e0e.zip gdb-046183de0ebe379c1ec11188000bb6e0f64a9e0e.tar.gz gdb-046183de0ebe379c1ec11188000bb6e0f64a9e0e.tar.bz2 |
bfd/
* 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.
ld/
* 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.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r-- | bfd/elflink.c | 59 |
1 files changed, 7 insertions, 52 deletions
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) { |