diff options
-rw-r--r-- | gnu/usr.bin/binutils/bfd/elf32-vax.c | 97 |
1 files changed, 64 insertions, 33 deletions
diff --git a/gnu/usr.bin/binutils/bfd/elf32-vax.c b/gnu/usr.bin/binutils/bfd/elf32-vax.c index 8ce4678e291..1aca042c61c 100644 --- a/gnu/usr.bin/binutils/bfd/elf32-vax.c +++ b/gnu/usr.bin/binutils/bfd/elf32-vax.c @@ -1,6 +1,6 @@ /* VAX series support for 32-bit ELF - Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004 Free Software Foundation, Inc. + Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + Free Software Foundation, Inc. Contributed by Matt Thomas <matt@3am-software.com>. This file is part of BFD, the Binary File Descriptor library. @@ -578,7 +578,7 @@ elf_vax_check_relocs (abfd, info, sec, relocs) asection *srelgot; asection *sreloc; - if (info->relocatable) + if (info->relocateable) return TRUE; dynobj = elf_hash_table (info)->dynobj; @@ -821,14 +821,14 @@ elf_vax_check_relocs (abfd, info, sec, relocs) /* This relocation describes the C++ object vtable hierarchy. Reconstruct it for later use during GC. */ case R_VAX_GNU_VTINHERIT: - if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) + if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) return FALSE; break; /* This relocation describes which C++ vtable entries are actually used. Record for later use during GC. */ case R_VAX_GNU_VTENTRY: - if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) + if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend)) return FALSE; break; @@ -892,21 +892,20 @@ elf_vax_gc_sweep_hook (abfd, info, sec, relocs) Elf_Internal_Shdr *symtab_hdr; struct elf_link_hash_entry **sym_hashes; const Elf_Internal_Rela *rel, *relend; + unsigned long r_symndx; + struct elf_link_hash_entry *h; bfd *dynobj; + symtab_hdr = &elf_tdata (abfd)->symtab_hdr; + sym_hashes = elf_sym_hashes (abfd); + dynobj = elf_hash_table (info)->dynobj; if (dynobj == NULL) return TRUE; - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - relend = relocs + sec->reloc_count; for (rel = relocs; rel < relend; rel++) { - unsigned long r_symndx; - struct elf_link_hash_entry *h; - switch (ELF32_R_TYPE (rel->r_info)) { case R_VAX_GOT32: @@ -1006,7 +1005,7 @@ elf_vax_adjust_dynamic_symbol (info, h) /* Make sure this symbol is output as a dynamic symbol. */ if (h->dynindx == -1) { - if (! bfd_elf_link_record_dynamic_symbol (info, h)) + if (! bfd_elf32_link_record_dynamic_symbol (info, h)) return FALSE; } @@ -1150,7 +1149,7 @@ elf_vax_size_dynamic_sections (output_bfd, info) if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (info->executable) + if (!info->shared) { s = bfd_get_section_by_name (dynobj, ".interp"); BFD_ASSERT (s != NULL); @@ -1297,7 +1296,7 @@ elf_vax_size_dynamic_sections (output_bfd, info) the .dynamic section. The DT_DEBUG entry is filled in by the dynamic linker and used by the debugger. */ #define add_dynamic_entry(TAG, VAL) \ - _bfd_elf_add_dynamic_entry (info, TAG, VAL) + bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL)) if (!info->shared) { @@ -1339,6 +1338,7 @@ elf_vax_size_dynamic_sections (output_bfd, info) in regular objects. We allocated space for them in the check_relocs routine, but we won't fill them in in the relocate_section routine. */ +/*ARGSUSED*/ static bfd_boolean elf_vax_discard_copies (h, ignore) struct elf_vax_link_hash_entry *h; @@ -1366,6 +1366,7 @@ elf_vax_discard_copies (h, ignore) creating a shared object or executable, space in the .got and .rela.got will be reserved for the symbol. */ +/*ARGSUSED*/ static bfd_boolean elf_vax_instantiate_got_entries (h, infoptr) struct elf_link_hash_entry *h; @@ -1400,7 +1401,7 @@ elf_vax_instantiate_got_entries (h, infoptr) /* Make sure this symbol is output as a dynamic symbol. */ if (h->dynindx == -1) { - if (!bfd_elf_link_record_dynamic_symbol (info, h)) + if (!bfd_elf32_link_record_dynamic_symbol (info, h)) return FALSE; } @@ -1439,7 +1440,7 @@ elf_vax_relocate_section (output_bfd, info, input_bfd, input_section, Elf_Internal_Rela *rel; Elf_Internal_Rela *relend; - if (info->relocatable) + if (info->relocateable) return TRUE; dynobj = elf_hash_table (info)->dynobj; @@ -1482,21 +1483,19 @@ elf_vax_relocate_section (output_bfd, info, input_bfd, input_section, { sym = local_syms + r_symndx; sec = local_sections[r_symndx]; - relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); } else { - bfd_boolean unresolved_reloc; - bfd_boolean warned; - - RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, - r_symndx, symtab_hdr, sym_hashes, - h, sec, relocation, - unresolved_reloc, warned); - - if ((h->root.type == bfd_link_hash_defined + h = sym_hashes[r_symndx - symtab_hdr->sh_info]; + 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; + if (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak) - && ((r_type == R_VAX_PLT32 + { + sec = h->root.u.def.section; + if ((r_type == R_VAX_PLT32 && h->plt.offset != (bfd_vma) -1 && elf_hash_table (info)->dynamic_sections_created) || (r_type == R_VAX_GOT32 @@ -1525,11 +1524,34 @@ elf_vax_relocate_section (output_bfd, info, input_bfd, input_section, || r_type == R_VAX_32 || r_type == R_VAX_PC8 || r_type == R_VAX_PC16 - || r_type == R_VAX_PC32)))) - /* In these cases, we don't need the relocation - value. We check specially because in some - obscure cases sec->output_section will be NULL. */ + || r_type == R_VAX_PC32))) + { + /* In these cases, we don't need the relocation + value. We check specially because in some + obscure cases sec->output_section will be NULL. */ + relocation = 0; + } + else + relocation = (h->root.u.def.value + + sec->output_section->vma + + sec->output_offset); + } + else if (h->root.type == bfd_link_hash_undefweak) relocation = 0; + else if (info->shared + && !info->no_undefined + && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) + relocation = 0; + else + { + if (!(info->callbacks->undefined_symbol + (info, h->root.root.string, input_bfd, + input_section, rel->r_offset, + (!info->shared || info->no_undefined + || ELF_ST_VISIBILITY (h->other))))) + return FALSE; + relocation = 0; + } } switch (r_type) @@ -1736,7 +1758,16 @@ elf_vax_relocate_section (output_bfd, info, input_bfd, input_section, { long indx; - if (bfd_is_abs_section (sec)) + if (h == NULL) + sec = local_sections[r_symndx]; + else + { + BFD_ASSERT (h->root.type == bfd_link_hash_defined + || (h->root.type + == bfd_link_hash_defweak)); + sec = h->root.u.def.section; + } + if (sec != NULL && bfd_is_abs_section (sec)) indx = 0; else if (sec == NULL || sec->owner == NULL) { @@ -2133,7 +2164,7 @@ elf_vax_finish_dynamic_sections (output_bfd, info) _bfd_elf_create_dynamic_sections #define bfd_elf32_bfd_link_hash_table_create \ elf_vax_link_hash_table_create -#define bfd_elf32_bfd_final_link bfd_elf_gc_common_final_link +#define bfd_elf32_bfd_final_link _bfd_elf32_gc_common_final_link #define elf_backend_check_relocs elf_vax_check_relocs #define elf_backend_adjust_dynamic_symbol \ |