summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Jaeger <aj@suse.de>2001-06-22 07:08:00 +0000
committerAndreas Jaeger <aj@suse.de>2001-06-22 07:08:00 +0000
commita6f574d4aac6f05c75a0269206d7cd7619bc809f (patch)
treea1b2effea578411f67020601e93dc76cc476bbe0
parent7defff4ad4e01d6c436e9ed5f073186bc3e52074 (diff)
downloadbinutils-gdb-a6f574d4aac6f05c75a0269206d7cd7619bc809f.tar.gz
* elf64-x86-64.c (elf64_x86_64_relocate_section): Fix linking of
shared libraries.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-x86-64.c20
2 files changed, 12 insertions, 13 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6120490f714..258371274e8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2001-06-20 Bo Thorsen <bo@suse.co.uk>
+
+ * elf64-x86-64.c (elf64_x86_64_relocate_section): Fix linking of
+ shared libraries.
+
2001-06-21 Alan Modra <amodra@bigpond.net.au>
* elf32-hppa.c (elf32_hppa_size_dynamic_sections): Always
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 206e70c3a69..61534681de4 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -1397,7 +1397,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:
@@ -1406,15 +1408,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;
@@ -1518,10 +1512,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;
+ }
}