[binutils-gdb] PR23937, powerpc64le local ifunc IRELATIVE relocs are wrong
Alan Modra
amodra@sourceware.org
Fri Nov 30 05:50:00 GMT 2018
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ba85c15dabe144e4bcee5a1b388b32bee10729e1
commit ba85c15dabe144e4bcee5a1b388b32bee10729e1
Author: Alan Modra <amodra@gmail.com>
Date: Fri Nov 30 15:34:11 2018 +1030
PR23937, powerpc64le local ifunc IRELATIVE relocs are wrong
IFUNC resolvers must always be called via their global entry point.
They will be called from ld.so rather than from the local executable.
PR 23937
bfd/
* elf64-ppc.c (write_plt_relocs_for_local_syms): Don't add local
entry offset for ifuncs.
ld/
* testsuite/ld-powerpc/pr23937.d,
* testsuite/ld-powerpc/pr23937.s: New test.
* testsuite/ld-powerpc/powerpc.exp: Run it.
Diff:
---
bfd/ChangeLog | 6 ++++
bfd/elf64-ppc.c | 3 +-
ld/ChangeLog | 6 ++++
ld/testsuite/ld-powerpc/powerpc.exp | 1 +
ld/testsuite/ld-powerpc/pr23937.d | 10 ++++++
ld/testsuite/ld-powerpc/pr23937.s | 65 +++++++++++++++++++++++++++++++++++++
6 files changed, 90 insertions(+), 1 deletion(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 602e0a2..8f455ae 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2018-11-30 Alan Modra <amodra@gmail.com>
+
+ PR 23937
+ * elf64-ppc.c (write_plt_relocs_for_local_syms): Don't add local
+ entry offset for ifuncs.
+
2018-11-29 H.J. Lu <hongjiu.lu@intel.com>
PR ld/23929
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 7c3534a..a2d3ea0 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -12882,7 +12882,8 @@ write_plt_relocs_for_local_syms (struct bfd_link_info *info)
}
val = sym->st_value + ent->addend;
- val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
+ if (ELF_ST_TYPE (sym->st_info) != STT_GNU_IFUNC)
+ val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
if (sym_sec != NULL && sym_sec->output_section != NULL)
val += sym_sec->output_offset + sym_sec->output_section->vma;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 5df13b8..e203edc 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,9 @@
+2018-11-30 Alan Modra <amodra@gmail.com>
+
+ * testsuite/ld-powerpc/pr23937.d,
+ * testsuite/ld-powerpc/pr23937.s: New test.
+ * testsuite/ld-powerpc/powerpc.exp: Run it.
+
2018-11-29 Thomas Preud'homme <thomas.preudhomme@linaro.org>
* ldlang.c (statement_list): Document purpose and what next field it
diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp
index 12590f1..826dfed 100644
--- a/ld/testsuite/ld-powerpc/powerpc.exp
+++ b/ld/testsuite/ld-powerpc/powerpc.exp
@@ -334,6 +334,7 @@ if [ supports_ppc64 ] then {
run_dump_test "dotsym2"
run_dump_test "dotsym3"
run_dump_test "dotsym4"
+ run_dump_test "pr23937"
}
run_dump_test "tlsld32"
diff --git a/ld/testsuite/ld-powerpc/pr23937.d b/ld/testsuite/ld-powerpc/pr23937.d
new file mode 100644
index 0000000..6ef79e8
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/pr23937.d
@@ -0,0 +1,10 @@
+#as: -a64
+#ld: -melf64ppc --defsym puts=0 --defsym _start=0
+#readelf: -srW
+# Check that the IRELATIVE addend is magic+0, not magic+8
+
+#...
+.* R_PPC64_IRELATIVE +10000180
+#...
+.*: 0+10000180 +20 IFUNC +LOCAL +DEFAULT .* magic
+#pass
diff --git a/ld/testsuite/ld-powerpc/pr23937.s b/ld/testsuite/ld-powerpc/pr23937.s
new file mode 100644
index 0000000..155e53a
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/pr23937.s
@@ -0,0 +1,65 @@
+ .abiversion 2
+ .text
+ .p2align 4,,15
+ .type implementation, @function
+implementation:
+.LCF0:
+ addis 2,12,.TOC.-.LCF0@ha
+ addi 2,2,.TOC.-.LCF0@l
+ .localentry implementation,.-implementation
+ mflr 0
+ addis 3,2,.LC0@toc@ha
+ addi 3,3,.LC0@toc@l
+ std 0,16(1)
+ stdu 1,-32(1)
+ bl puts
+ nop
+ addi 1,1,32
+ li 3,0
+ ld 0,16(1)
+ mtlr 0
+ blr
+ .size implementation,.-implementation
+
+ .p2align 4,,15
+ .type resolver, @function
+resolver:
+.LCF1:
+ addis 2,12,.TOC.-.LCF1@ha
+ addi 2,2,.TOC.-.LCF1@l
+ .localentry resolver,.-resolver
+ addis 3,2,implementation@toc@ha
+ addi 3,3,implementation@toc@l
+ blr
+ .size resolver,.-resolver
+
+ .type magic, @gnu_indirect_function
+ .set magic,resolver
+
+ .section .text.startup,"ax",@progbits
+ .p2align 4,,15
+ .globl main
+ .type main, @function
+main:
+.LCF2:
+ addis 2,12,.TOC.-.LCF2@ha
+ addi 2,2,.TOC.-.LCF2@l
+ .localentry main,.-main
+ mflr 0
+ std 0,16(1)
+ stdu 1,-32(1)
+ bl magic
+ nop
+ addi 1,1,32
+ cntlzw 3,3
+ ld 0,16(1)
+ srwi 3,3,5
+ mtlr 0
+ xori 3,3,0x1
+ blr
+ .size main,.-main
+
+ .section .rodata.str1.8,"aMS",@progbits,1
+ .p2align 3
+.LC0:
+ .string "'ere I am JH"
More information about the Binutils-cvs
mailing list