[PATCH] RISC-V: Bind defined symbol locally in PIE

Linsen Zhou i@lin.moe
Sun Jul 6 05:00:30 GMT 2025


Reference commit 1dcb9720d62cd053a72c31881b7724ce9f74332c

bfd/
	* elfnn-riscv.c (RISCV_COPY_INPUT_RELOC): Bind defined symbol
	locally in PIE.

ld/
	* testsuite/ld-riscv-elf/pie-bind-locally-a.s: New test source.
	* testsuite/ld-riscv-elf/pie-bind-locally-b.s: Likewise.
	* testsuite/ld-riscv-elf/pie-bind-locally-rv32.d: New testcase.
	* testsuite/ld-riscv-elf/pie-bind-locally-rv64.d: Likewise.
---
 bfd/ChangeLog                                     |  4 ++++
 bfd/elfnn-riscv.c                                 |  2 +-
 ld/ChangeLog                                      |  7 +++++++
 ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp        |  3 +++
 ld/testsuite/ld-riscv-elf/pie-bind-locally-a.s    |  9 +++++++++
 ld/testsuite/ld-riscv-elf/pie-bind-locally-b.s    |  8 ++++++++
 ld/testsuite/ld-riscv-elf/pie-bind-locally-rv32.d | 10 ++++++++++
 ld/testsuite/ld-riscv-elf/pie-bind-locally-rv64.d | 10 ++++++++++
 8 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100644 ld/testsuite/ld-riscv-elf/pie-bind-locally-a.s
 create mode 100644 ld/testsuite/ld-riscv-elf/pie-bind-locally-b.s
 create mode 100644 ld/testsuite/ld-riscv-elf/pie-bind-locally-rv32.d
 create mode 100644 ld/testsuite/ld-riscv-elf/pie-bind-locally-rv64.d

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3f0248717b2..bdc7015f2a6 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,7 @@
+2025-04-18  Linsen Zhou <i@lin.moe>
+	* elfnn-riscv.c (RISCV_COPY_INPUT_RELOC): Bind defined symbol
+	locally in PIE.
+
 2025-02-08  Alexandre Oliva <oliva@adacore.com>
 
 	* elfxx-sparc.c (_bfd_sparc_elf_check_relocs): Check for
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index 790f0397cf5..2fd01299249 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -99,7 +99,7 @@
   ((H) != NULL \
    && (H)->dynindx != -1 \
    && (!bfd_link_pic (INFO) \
-       || !SYMBOLIC_BIND ((INFO), (H)) \
+       || !(bfd_link_pie ((INFO)) || SYMBOLIC_BIND ((INFO), (H))) \
        || !(H)->def_regular))
 
 /* True if this is actually a static link, or it is a -Bsymbolic link
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 69dad59018f..bcee7fde343 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2025-04-18  Linsen Zhou <i@lin.moe>
+
+	* testsuite/ld-riscv-elf/pie-bind-locally-a.s: New test source.
+	* testsuite/ld-riscv-elf/pie-bind-locally-b.s: Likewise.
+	* testsuite/ld-riscv-elf/pie-bind-locally-rv32.d: New testcase.
+	* testsuite/ld-riscv-elf/pie-bind-locally-rv64.d: Likewise.
+
 2025-02-08  Alexandre Oliva <oliva@adacore.com>
 
 	* testsuite/ld-sparc/got-def.s: New test.
diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
index e103df66e11..70c9aa7f66a 100644
--- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
+++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
@@ -235,6 +235,9 @@ if [istarget "riscv*-*-*"] {
 
     run_dump_test "zicfilp-unlabeled-plt"
 
+    run_dump_test "pie-bind-locally-rv32"
+    run_dump_test "pie-bind-locally-rv64"
+
     # IFUNC testcases.
     # Check IFUNC by single type relocs.
     run_dump_test_ifunc "ifunc-reloc-call-01" rv32 exe
diff --git a/ld/testsuite/ld-riscv-elf/pie-bind-locally-a.s b/ld/testsuite/ld-riscv-elf/pie-bind-locally-a.s
new file mode 100644
index 00000000000..cc40df88cff
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/pie-bind-locally-a.s
@@ -0,0 +1,9 @@
+	.text
+	.global	_start
+_start:
+.L1:	auipc  a0, %got_pcrel_hi(_start)
+.ifdef __64_bit__
+	ld	a0, %pcrel_lo(.L1)(a0)
+.else
+	lw	a0, %pcrel_lo (.L1)(a0)
+.endif
diff --git a/ld/testsuite/ld-riscv-elf/pie-bind-locally-b.s b/ld/testsuite/ld-riscv-elf/pie-bind-locally-b.s
new file mode 100644
index 00000000000..e5f16cdf9df
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/pie-bind-locally-b.s
@@ -0,0 +1,8 @@
+	.section	.data.rel,"aw",%progbits
+	.type	q, %object
+q:
+.ifdef __64_bit__
+	.quad	_start
+.else
+	.word	_start
+.endif
diff --git a/ld/testsuite/ld-riscv-elf/pie-bind-locally-rv32.d b/ld/testsuite/ld-riscv-elf/pie-bind-locally-rv32.d
new file mode 100644
index 00000000000..01339952225
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/pie-bind-locally-rv32.d
@@ -0,0 +1,10 @@
+#source: pie-bind-locally-a.s
+#source: pie-bind-locally-b.s
+#as: -march=rv32i -mabi=ilp32
+#ld: -m[riscv_choose_ilp32_emul] -pie
+#readelf: -Wr
+
+Relocation section '\.rela\.dyn' at offset .* contains 2 entries:
+[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
+[0-9a-f]+[ 	]+[0-9a-f]+[ 	]+R_RISCV_RELATIVE[ ].*
+[0-9a-f]+[ 	]+[0-9a-f]+[ 	]+R_RISCV_RELATIVE[ ].*
diff --git a/ld/testsuite/ld-riscv-elf/pie-bind-locally-rv64.d b/ld/testsuite/ld-riscv-elf/pie-bind-locally-rv64.d
new file mode 100644
index 00000000000..6ae627a7060
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/pie-bind-locally-rv64.d
@@ -0,0 +1,10 @@
+#source: pie-bind-locally-a.s
+#source: pie-bind-locally-b.s
+#as: -march=rv64i -mabi=lp64 -defsym __64_bit__=1
+#ld: -m[riscv_choose_lp64_emul] -pie
+#readelf: -Wr
+
+Relocation section '\.rela\.dyn' at offset .* contains 2 entries:
+[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
+[0-9a-f]+[ 	]+[0-9a-f]+[ 	]+R_RISCV_RELATIVE[ ].*
+[0-9a-f]+[ 	]+[0-9a-f]+[ 	]+R_RISCV_RELATIVE[ ].*
-- 
2.50.0



-- 
Linsen Zhou
https://lin.moe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 243 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20250706/708cd986/attachment.sig>


More information about the Binutils mailing list