This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.

Applied master and binutils-2.31 branch.

	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 --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 7c3534ac65..a2d3ea067c 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/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp
index 12590f1817..826dfedc12 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 0000000000..6ef79e81cf
--- /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 0000000000..155e53adb7
--- /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"

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]