From f631948d0b929cf4a36bca085e8c85230dc694c2 Mon Sep 17 00:00:00 2001 From: Andreas Jaeger Date: Thu, 21 Jun 2001 16:33:14 +0000 Subject: * elf64-x86-64.c (elf64_x86_64_relocate_section): Fix linking of shared libraries. --- bfd/ChangeLog | 9 +++++++-- bfd/elf64-x86-64.c | 20 +++++++------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index bf87bd5..201938b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2001-06-20 Bo Thorsen + + * elf64-x86-64.c (elf64_x86_64_relocate_section): Fix linking of + shared libraries. + 2001-06-18 Thiemo Seufer * configure.host (mips64-*-linux): Reformat. @@ -24,7 +29,7 @@ elf_backend_emit_relocs and elf_backend_count_relocs. * elflink.h (elf_link_size_reloc_section): Make the hash table big enough to hold the relocs counted by either reloc_count or - o->reloc_count. + o->reloc_count. (elf_bfd_final_link) emit_relocs: New boolean, set if relocs should be emitted, either because of a command line option stored in the info structure or because the target provides a @@ -72,7 +77,7 @@ * elf32-mips.c (mips_elf_link_hash_entry): Add a new field, readonly_reloc, to record if a relocation in the .rel.dyn - section is against a read-only section. + section is against a read-only section. (mips_elf_link_hash_newfunc): Initialize the readonly_reloc field to false. (_bfd_mips_elf_check_relocs): Record if there is a relocation diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 57d4005..7b37d96 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1442,7 +1442,9 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section, case R_X86_64_PC8: case R_X86_64_PC16: case R_X86_64_PC32: - if (h == NULL) + if (h == NULL || h->dynindx == -1 + || (info->symbolic + && h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) break; /* Fall through. */ case R_X86_64_8: @@ -1451,15 +1453,7 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section, case R_X86_64_64: /* FIXME: The ABI says the linker should make sure the value is the same when it's zeroextended to 64 bit. */ - if (info->shared - && (input_section->flags & SEC_ALLOC) != 0 - && ((r_type != R_X86_64_PC8 - && r_type != R_X86_64_PC16 - && r_type != R_X86_64_PC32) - || (! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0))) - + if (info->shared && (input_section->flags & SEC_ALLOC) != 0) { Elf_Internal_Rela outrel; boolean skip, relocate; @@ -1563,10 +1557,10 @@ elf64_x86_64_relocate_section (output_bfd, info, input_bfd, input_section, BFD_ASSERT (indx > 0); } - relocate = false; + relocate = false; outrel.r_info = ELF64_R_INFO (indx, r_type); - outrel.r_addend = relocation + rela->r_addend; - } + outrel.r_addend = relocation + rela->r_addend; + } } -- cgit v1.1