diff options
author | Alan Modra <amodra@gmail.com> | 2001-11-10 00:23:35 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2001-11-10 00:23:35 +0000 |
commit | ec33885937c311707a20bac4207422abde93511e (patch) | |
tree | 7d3fdaa1992e5b43d29c43231656af5fb929e1cf /bfd/elflink.h | |
parent | a73b8fec642fa30101cfef7fb8a8544361eae636 (diff) | |
download | gdb-ec33885937c311707a20bac4207422abde93511e.zip gdb-ec33885937c311707a20bac4207422abde93511e.tar.gz gdb-ec33885937c311707a20bac4207422abde93511e.tar.bz2 |
* elf32-arm.h (elf32_arm_final_link_relocate): Don't copy STN_UNDEF
relocs into shared libs.
* elf32-cris.c (cris_elf_relocate_section): Likewise.
* elf32-i370.c (i370_elf_relocate_section): Likewise.
* elf32-m68k.c (elf_m68k_relocate_section): Likewise.
* elf32-mips.c (mips_elf_calculate_relocation): Likewise.
* elf32-ppc.c (ppc_elf_relocate_section): Likewise.
* elf32-sh.c (sh_elf_relocate_section): Likewise.
* elf32-sparc.c (elf32_sparc_relocate_section): Likewise.
* elf64-alpha.c (elf64_alpha_relocate_section): Likewise.
* elf64-s390.c (elf_s390_relocate_section): Likewise.
* elf64-sparc.c (sparc64_elf_relocate_section): Likewise.
* elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise.
* elfxx-ia64.c (elfNN_ia64_relocate_section): Likewise.
* elf.c (bfd_section_from_r_symndx): New function.
* elf-bfd.h (LOCAL_SYM_CACHE_SIZE): Define.
(struct sym_sec_cache): New.
(bfd_section_from_r_symndx): Declare.
(struct bfd_elf_section_data): Change local_dynrel type to PTR.
* elflink.h (elf_link_input_bfd): Don't test for removed linkonce
relocs when relocatable. Don't zero entire reloc, just zero the
addend and sym.
* elf32-i386.c (struct elf_i386_link_hash_table): Add sym_sec.
(elf_i386_link_hash_table_create): Init it.
(elf_i386_check_relocs): Track dynamic relocs needed for local
syms on a per-section basis as we do for globals.
(elf_i386_gc_sweep_hook): Update for local_dynrel change.
Remove dead code.
(allocate_dynrelocs): Warning fix.
(elf_i386_size_dynamic_sections): Don't allocate relocs when
section has been discarded.
(elf_i386_relocate_section): Don't copy STN_UNDEF relocs
into shared libs.
* elf32-hppa.c: Likewise.
* elf32-s390.c: Likewise.
* elf64-ppc.c: Likewise.
* elf64-s390.c: Likewise.
Diffstat (limited to 'bfd/elflink.h')
-rw-r--r-- | bfd/elflink.h | 204 |
1 files changed, 104 insertions, 100 deletions
diff --git a/bfd/elflink.h b/bfd/elflink.h index d1db64a..a4fb88d 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -6277,117 +6277,121 @@ elf_link_input_bfd (finfo, input_bfd) && o->reloc_count > 0) return false; - { - Elf_Internal_Rela *rel, *relend; - /* Run through the relocs looking for any against symbols - from discarded sections and section symbols from - removed link-once sections. Complain about relocs - against discarded sections. Zero relocs against removed - link-once sections. We should really complain if - anything in the final link tries to use it, but - DWARF-based exception handling might have an entry in - .eh_frame to describe a routine in the linkonce section, - and it turns out to be hard to remove the .eh_frame - entry too. FIXME. */ - rel = internal_relocs; - relend = rel + o->reloc_count * bed->s->int_rels_per_ext_rel; - for ( ; rel < relend; rel++) - { - unsigned long r_symndx = ELF_R_SYM (rel->r_info); + /* Run through the relocs looking for any against symbols + from discarded sections and section symbols from + removed link-once sections. Complain about relocs + against discarded sections. Zero relocs against removed + link-once sections. We should really complain if + anything in the final link tries to use it, but + DWARF-based exception handling might have an entry in + .eh_frame to describe a routine in the linkonce section, + and it turns out to be hard to remove the .eh_frame + entry too. FIXME. */ + if (!finfo->info->relocateable) + { + Elf_Internal_Rela *rel, *relend; - if (r_symndx >= locsymcount - || (elf_bad_symtab (input_bfd) - && finfo->sections[r_symndx] == NULL)) - { - struct elf_link_hash_entry *h; - - h = sym_hashes[r_symndx - extsymoff]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - - /* Complain if the definition comes from a - discarded section. */ - if ((h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - && ! bfd_is_abs_section (h->root.u.def.section) - && bfd_is_abs_section (h->root.u.def.section - ->output_section)) - { + rel = internal_relocs; + relend = rel + o->reloc_count * bed->s->int_rels_per_ext_rel; + for ( ; rel < relend; rel++) + { + unsigned long r_symndx = ELF_R_SYM (rel->r_info); + + if (r_symndx >= locsymcount + || (elf_bad_symtab (input_bfd) + && finfo->sections[r_symndx] == NULL)) + { + struct elf_link_hash_entry *h; + + h = sym_hashes[r_symndx - extsymoff]; + while (h->root.type == bfd_link_hash_indirect + || h->root.type == bfd_link_hash_warning) + h = (struct elf_link_hash_entry *) h->root.u.i.link; + + /* Complain if the definition comes from a + discarded section. */ + if ((h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak) + && ! bfd_is_abs_section (h->root.u.def.section) + && bfd_is_abs_section (h->root.u.def.section + ->output_section)) + { #if BFD_VERSION_DATE < 20031005 - if ((o->flags & SEC_DEBUGGING) != 0) - { + if ((o->flags & SEC_DEBUGGING) != 0) + { #if BFD_VERSION_DATE > 20021005 - (*finfo->info->callbacks->warning) - (finfo->info, - _("warning: relocation against removed section; zeroing"), - NULL, input_bfd, o, rel->r_offset); + (*finfo->info->callbacks->warning) + (finfo->info, + _("warning: relocation against removed section; zeroing"), + NULL, input_bfd, o, rel->r_offset); #endif memset (rel, 0, sizeof (*rel)); - } - else + } + else #endif - { - if (! ((*finfo->info->callbacks->undefined_symbol) - (finfo->info, h->root.root.string, - input_bfd, o, rel->r_offset, - true))) - return false; - } - } - } - else - { - isym = finfo->internal_syms + r_symndx; - if (ELF_ST_TYPE (isym->st_info) == STT_SECTION) - { - asection *sec = finfo->sections[r_symndx]; + { + if (! ((*finfo->info->callbacks->undefined_symbol) + (finfo->info, h->root.root.string, + input_bfd, o, rel->r_offset, + true))) + return false; + } + } + } + else + { + isym = finfo->internal_syms + r_symndx; + if (ELF_ST_TYPE (isym->st_info) == STT_SECTION) + { + asection *sec = finfo->sections[r_symndx]; - if (sec != NULL - && ! bfd_is_abs_section (sec) - && bfd_is_abs_section (sec->output_section)) - { + if (sec != NULL + && ! bfd_is_abs_section (sec) + && bfd_is_abs_section (sec->output_section)) + { #if BFD_VERSION_DATE < 20031005 - if ((o->flags & SEC_DEBUGGING) != 0 - || (sec->flags & SEC_LINK_ONCE) != 0) - { + if ((o->flags & SEC_DEBUGGING) != 0 + || (sec->flags & SEC_LINK_ONCE) != 0) + { #if BFD_VERSION_DATE > 20021005 - (*finfo->info->callbacks->warning) - (finfo->info, - _("warning: relocation against removed section"), - NULL, input_bfd, o, rel->r_offset); + (*finfo->info->callbacks->warning) + (finfo->info, + _("warning: relocation against removed section"), + NULL, input_bfd, o, rel->r_offset); #endif - memset (rel, 0, sizeof (*rel)); - } - else + rel->r_info + = ELF_R_INFO (0, ELF_R_TYPE (rel->r_info)); + rel->r_addend = 0; + } + else #endif - { - boolean ok; - const char *msg - = _("local symbols in discarded section %s"); - bfd_size_type amt - = strlen (sec->name) + strlen (msg) - 1; - char *buf = (char *) bfd_malloc (amt); - - if (buf != NULL) - sprintf (buf, msg, sec->name); - else - buf = (char *) sec->name; - ok = (*finfo->info->callbacks - ->undefined_symbol) (finfo->info, buf, - input_bfd, o, - rel->r_offset, - true); - if (buf != sec->name) - free (buf); - if (!ok) - return false; - } - } - } - } - } - } + { + boolean ok; + const char *msg + = _("local symbols in discarded section %s"); + bfd_size_type amt + = strlen (sec->name) + strlen (msg) - 1; + char *buf = (char *) bfd_malloc (amt); + + if (buf != NULL) + sprintf (buf, msg, sec->name); + else + buf = (char *) sec->name; + ok = (*finfo->info->callbacks + ->undefined_symbol) (finfo->info, buf, + input_bfd, o, + rel->r_offset, + true); + if (buf != sec->name) + free (buf); + if (!ok) + return false; + } + } + } + } + } + } /* Relocate the section by invoking a back end routine. |