diff options
author | Alan Modra <amodra@gmail.com> | 2005-07-14 13:54:23 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2005-07-14 13:54:23 +0000 |
commit | a3c2b96af6bbf3ab11d9f5532093c8c3c346df4a (patch) | |
tree | 3dd2957dd59a3b39e4a89b121783842534195ddc /bfd/elflink.c | |
parent | bfaaa3c28b9c0ada4c322c895e4cf1349abfd10d (diff) | |
download | gdb-a3c2b96af6bbf3ab11d9f5532093c8c3c346df4a.zip gdb-a3c2b96af6bbf3ab11d9f5532093c8c3c346df4a.tar.gz gdb-a3c2b96af6bbf3ab11d9f5532093c8c3c346df4a.tar.bz2 |
bfd/
* bfd-in.h (_bfd_elf_fix_excluded_sec_syms): Declare.
(_bfd_elf_provide_section_bound_symbols): Remove param name.
Formatting.
* bfd-in2.h: Regenerate.
* elflink.c (bfd_elf_gc_sections): Don't call generic function.
(_bfd_elf_provide_symbol): Formatting.
(_bfd_elf_provide_section_bound_symbols): Remove all hacks, just
create section relative syms.
(fix_syms, _bfd_elf_fix_excluded_sec_syms): New functions.
* elf32-ppc.c (ppc_elf_set_sdata_syms): Use
_bfd_elf_provide_section_bound_symbols.
* reloc.c (bfd_mark_used_section): Delete.
(bfd_generic_gc_sections): Don't call the above.
ld/
* ldlang.c (strip_excluded_output_sections): Don't call
bfd_gc_sections.
* emultempl/elf32.em (gld*_provide_bound_symbols): Move.
(gld*_provide_init_fini_syms): Move.
(gld*_before_allocation): Call the above from here..
(gld*_finish): ..not here. Call _bfd_elf_fix_excluded_sec_syms.
* emultempl/hppaelf.em (hppaelf_finish): Likewise.
* emultempl/ppc64elf.em (ppc_finish): Likewise.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r-- | bfd/elflink.c | 68 |
1 files changed, 30 insertions, 38 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c index 6177f53..791575b 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -9119,9 +9119,6 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info) (asection *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *h, Elf_Internal_Sym *); - if (!info->gc_sections) - return bfd_generic_gc_sections (abfd, info); - if (!get_elf_backend_data (abfd)->can_gc_sections || info->relocatable || info->emitrelocations @@ -9846,8 +9843,7 @@ _bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name, { struct elf_link_hash_entry *h; - h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, - FALSE); + h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE); if (h != NULL && !h->def_regular) bfd_elf_set_symbol (h, val, s); } @@ -9861,45 +9857,41 @@ _bfd_elf_provide_section_bound_symbols (struct bfd_link_info *info, const char *start, const char *end) { - struct elf_link_hash_entry *hs, *he; - bfd_vma start_val, end_val; - bfd_boolean do_start, do_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); +} - /* Check if we need them or not first. */ - hs = elf_link_hash_lookup (elf_hash_table (info), start, FALSE, - FALSE, FALSE); - do_start = hs != NULL && !hs->def_regular; +/* Convert symbols in excluded output sections to absolute. */ - he = elf_link_hash_lookup (elf_hash_table (info), end, FALSE, - FALSE, FALSE); - do_end = he != NULL && !he->def_regular; +static bfd_boolean +fix_syms (struct bfd_link_hash_entry *h, void *data) +{ + bfd *obfd = (bfd *) data; - if (!do_start && !do_end) - return; + if (h->type == bfd_link_hash_warning) + h = h->u.i.link; - if (sec != NULL) + if (h->type == bfd_link_hash_defined + || h->type == bfd_link_hash_defweak) { - start_val = sec->vma; - end_val = start_val + sec->size; - } - else - { - /* We have to choose those values very carefully. Some targets, - like alpha, may have relocation overflow with 0. "__bss_start" - should be defined in all cases. */ - struct elf_link_hash_entry *h - = elf_link_hash_lookup (elf_hash_table (info), "__bss_start", - FALSE, FALSE, FALSE); - if (h != NULL && h->root.type == bfd_link_hash_defined) - start_val = h->root.u.def.value; - else - start_val = 0; - end_val = start_val; + asection *s = h->u.def.section; + if (s != NULL + && s == s->output_section + && bfd_section_removed_from_list (obfd, s)) + { + h->u.def.value += s->vma; + h->u.def.section = bfd_abs_section_ptr; + } } - if (do_start) - bfd_elf_set_symbol (hs, start_val, NULL); + return TRUE; +} - if (do_end) - bfd_elf_set_symbol (he, end_val, NULL); +void +_bfd_elf_fix_excluded_sec_syms (bfd *obfd, struct bfd_link_info *info) +{ + bfd_link_hash_traverse (info->hash, fix_syms, obfd); } |