summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2009-12-03 08:31:28 +0000
committerAlan Modra <amodra@bigpond.net.au>2009-12-03 08:31:28 +0000
commit9322f582cead1bc706207a0e5c5434ddefaae8dd (patch)
tree7eb78e1bca38b5e0f6ab853750e813aeedf3231c
parentb5d92ab1a147c77edebac22866e5c9244984ff52 (diff)
downloadbinutils-redhat-9322f582cead1bc706207a0e5c5434ddefaae8dd.tar.gz
PR ld/11047
* elf32-ppc.c (ppc_elf_relocate_section): Delete __tls_get_addr symbol reference from relocs belonging to calls that are optimized away. * elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf32-ppc.c10
-rw-r--r--bfd/elf64-ppc.c9
3 files changed, 14 insertions, 13 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 49d8217374..8db9a34744 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2009-12-03 Alan Modra <amodra@bigpond.net.au>
+
+ PR ld/11047
+ * elf32-ppc.c (ppc_elf_relocate_section): Delete __tls_get_addr
+ symbol reference from relocs belonging to calls that are
+ optimized away.
+ * elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
+
2009-12-02 Jerker Bäck <jerker.back@gmail.com>
PR binutils/11017
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index e4fdc1ea23..976dd3700d 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -6929,9 +6929,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
insn1 |= 32 << 26; /* lwz */
if (offset != (bfd_vma) -1)
{
- rel[1].r_info
- = ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info),
- R_PPC_NONE);
+ rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
insn2 = 0x7c631214; /* add 3,3,2 */
bfd_put_32 (output_bfd, insn2, contents + offset);
}
@@ -7005,8 +7003,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
bfd_put_32 (output_bfd, insn2, contents + offset);
/* Zap the reloc on the _tls_get_addr call too. */
BFD_ASSERT (offset == rel[1].r_offset);
- rel[1].r_info = ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info),
- R_PPC_NONE);
+ rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
}
break;
@@ -7035,8 +7032,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
contents + rel->r_offset - d_offset);
/* Zap the reloc on the _tls_get_addr call too. */
BFD_ASSERT (rel->r_offset - d_offset == rel[1].r_offset);
- rel[1].r_info = ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info),
- R_PPC_NONE);
+ rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
rel--;
continue;
}
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index e748a41fcc..94f89c57be 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -11102,8 +11102,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
insn1 |= 58 << 26; /* ld */
insn2 = 0x7c636a14; /* add 3,3,13 */
if (offset != (bfd_vma) -1)
- rel[1].r_info = ELF64_R_INFO (ELF64_R_SYM (rel[1].r_info),
- R_PPC64_NONE);
+ rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
if ((tls_mask & TLS_EXPLICIT) == 0)
r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
+ R_PPC64_GOT_TPREL16_DS);
@@ -11202,8 +11201,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
rel->r_info = ELF64_R_INFO (r_symndx, r_type);
/* Zap the reloc on the _tls_get_addr call too. */
BFD_ASSERT (offset == rel[1].r_offset);
- rel[1].r_info = ELF64_R_INFO (ELF64_R_SYM (rel[1].r_info),
- R_PPC64_NONE);
+ rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
insn3 = bfd_get_32 (output_bfd,
contents + offset + 4);
if (insn3 == NOP
@@ -11248,8 +11246,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
rel->r_offset = offset + d_offset;
/* Zap the reloc on the _tls_get_addr call too. */
BFD_ASSERT (offset == rel[1].r_offset);
- rel[1].r_info = ELF64_R_INFO (ELF64_R_SYM (rel[1].r_info),
- R_PPC64_NONE);
+ rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
insn2 = 0x38630000; /* addi 3,3,0 */
insn3 = bfd_get_32 (output_bfd,
contents + offset + 4);