summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorNelson Chu <nelson@rivosinc.com>2022-09-12 09:26:52 +0800
committerNelson Chu <nelson@rivosinc.com>2022-09-12 11:31:41 +0800
commitecb915b4de7569027ad78bd3e24873bb92cb8e32 (patch)
tree322bc83c90f3bf3b2be8c4b3d696dcaaf0d328d1 /ld
parent0967e2e4926f07de0ff0eabd16ea8965c63b9f2e (diff)
downloadbinutils-gdb-ecb915b4de7569027ad78bd3e24873bb92cb8e32.tar.gz
RISC-V: PR28509, the default visibility symbol cannot be referenced by R_RISCV_JAL.
When generating the shared object, the default visibility symbols may bind externally, which means they will be exported to the dynamic symbol table, and are preemptible by default. These symbols cannot be referenced by the non-pic R_RISCV_JAL and R_RISCV_RVC_JUMP. However, consider that linker may relax the R_RISCV_CALL relocations to R_RISCV_JAL or R_RISCV_RVC_JUMP, if these relocations are relocated to the plt entries, then we won't report error for them. Perhaps we also need the similar checks for the R_RISCV_BRANCH and R_RISCV_RVC_BRANCH relocations. After applying this patch, and revert the following glibc patch, riscv: Fix incorrect jal with HIDDEN_JUMPTARGET https://sourceware.org/git/?p=glibc.git;a=commit;h=68389203832ab39dd0dbaabbc4059e7fff51c29b I get the expected errors as follows, ld: relocation R_RISCV_RVC_JUMP against `__sigsetjmp' which may bind externally can not be used when making a shared object; recompile with -fPIC ld: relocation R_RISCV_JAL against `exit' which may bind externally can not be used when making a shared object; recompile with -fPIC Besides, we also have similar changes for libgcc, RISC-V: jal cannot refer to a default visibility symbol for shared object https://github.com/gcc-mirror/gcc/commit/45116f342057b7facecd3d05c2091ce3a77eda59 bfd/ pr 28509 * elfnn-riscv.c (riscv_elf_relocate_section): Report errors when makeing a shard object, and the referenced symbols of R_RISCV_JAL relocations are default visibility. Besides, we should handle most of the cases here, so don't need the unresolvable check later for R_RISCV_JAL and R_RISCV_RVC_JUMP. ld/ pr 28509 * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated. * testsuite/ld-riscv-elf/lib-nopic-01a.s: Removed. * testsuite/ld-riscv-elf/lib-nopic-01b.d: Likewise. * testsuite/ld-riscv-elf/lib-nopic-01b.s: Likewise. * testsuite/ld-riscv-elf/shared-lib-nopic-01.d: New testcase. * testsuite/ld-riscv-elf/shared-lib-nopic-01.s: Likewise. * testsuite/ld-riscv-elf/shared-lib-nopic-02.d: Likewise. * testsuite/ld-riscv-elf/shared-lib-nopic-02.s: Likewise. * testsuite/ld-riscv-elf/shared-lib-nopic-03.d: Likewise. * testsuite/ld-riscv-elf/shared-lib-nopic-03.s: Likewise. * testsuite/ld-riscv-elf/shared-lib-nopic-04.d: Likewise. * testsuite/ld-riscv-elf/shared-lib-nopic-04.s: Likewise.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp10
-rw-r--r--ld/testsuite/ld-riscv-elf/lib-nopic-01a.s9
-rw-r--r--ld/testsuite/ld-riscv-elf/lib-nopic-01b.d5
-rw-r--r--ld/testsuite/ld-riscv-elf/lib-nopic-01b.s9
-rw-r--r--ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.d4
-rw-r--r--ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.s3
-rw-r--r--ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.d4
-rw-r--r--ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.s12
-rw-r--r--ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.d14
-rw-r--r--ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.s13
-rw-r--r--ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.d15
-rw-r--r--ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.s14
12 files changed, 83 insertions, 29 deletions
diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
index 272424b33e3..df89e0ee68b 100644
--- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
+++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
@@ -210,12 +210,10 @@ if [istarget "riscv*-*-*"] {
"gp-test-${abi}"]]
}
- run_ld_link_tests {
- { "Link non-pic code into a shared library (setup)"
- "-shared" "" "" {lib-nopic-01a.s}
- {} "lib-nopic-01a.so" }
- }
- run_dump_test "lib-nopic-01b"
+ run_dump_test "shared-lib-nopic-01"
+ run_dump_test "shared-lib-nopic-02"
+ run_dump_test "shared-lib-nopic-03"
+ run_dump_test "shared-lib-nopic-04"
# IFUNC testcases.
# Check IFUNC by single type relocs.
diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s b/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
deleted file mode 100644
index 632875d423a..00000000000
--- a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
+++ /dev/null
@@ -1,9 +0,0 @@
- .option nopic
- .text
- .align 1
- .globl func1
- .type func1, @function
-func1:
- jal func2
- jr ra
- .size func1, .-func1
diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
deleted file mode 100644
index 1c2c907fc30..00000000000
--- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
+++ /dev/null
@@ -1,5 +0,0 @@
-#name: link non-pic code into a shared library
-#source: lib-nopic-01b.s
-#as:
-#ld: -shared tmpdir/lib-nopic-01a.so
-#error: .*relocation R_RISCV_JAL against `func1' can not be used when making a shared object; recompile with -fPIC
diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
deleted file mode 100644
index ea7b0298895..00000000000
--- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
+++ /dev/null
@@ -1,9 +0,0 @@
- .option nopic
- .text
- .align 1
- .globl func2
- .type func2, @function
-func2:
- jal func1
- jr ra
- .size func2, .-func2
diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.d b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.d
new file mode 100644
index 00000000000..2ea851247f6
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.d
@@ -0,0 +1,4 @@
+#source: shared-lib-nopic-01.s
+#as:
+#ld: -shared
+#error: .*relocation R_RISCV_JAL against `foo' which may bind externally can not be used when making a shared object; recompile with -fPIC
diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.s b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.s
new file mode 100644
index 00000000000..8d85c17cbdf
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.s
@@ -0,0 +1,3 @@
+ .option nopic
+ .text
+ jal foo # undefined
diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.d b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.d
new file mode 100644
index 00000000000..f866d017362
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.d
@@ -0,0 +1,4 @@
+#source: shared-lib-nopic-02.s
+#as:
+#ld: -shared
+#error: .*relocation R_RISCV_JAL against `foo_default' which may bind externally can not be used when making a shared object; recompile with -fPIC
diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.s b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.s
new file mode 100644
index 00000000000..61a8cc1a87b
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.s
@@ -0,0 +1,12 @@
+ .option nopic
+ .text
+ .align 1
+
+ jal foo_default
+
+ .globl foo_default
+ .type foo_default, @function
+foo_default:
+ nop
+ ret
+ .size foo_default, .-foo_default
diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.d b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.d
new file mode 100644
index 00000000000..182a557bab8
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.d
@@ -0,0 +1,14 @@
+#source: shared-lib-nopic-03.s
+#as:
+#ld: -shared
+#objdump: -d
+
+.*:[ ]+file format .*
+
+Disassembly of section \.text:
+
+#...
+.*:[ ]+[0-9a-f]+[ ]+jal[ ]+.* <foo_default>
+
+0+[0-9a-f]+ <foo_default>:
+#...
diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.s b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.s
new file mode 100644
index 00000000000..d1855f8ff30
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.s
@@ -0,0 +1,13 @@
+ .option nopic
+ .text
+ .align 1
+
+ jal foo_default
+
+ .globl foo_default
+ .hidden foo_default
+ .type foo_default, @function
+foo_default:
+ nop
+ ret
+ .size foo_default, .-foo_default
diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.d b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.d
new file mode 100644
index 00000000000..e66b721a137
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.d
@@ -0,0 +1,15 @@
+#source: shared-lib-nopic-04.s
+#as:
+#ld: -shared
+#objdump: -d
+
+.*:[ ]+file format .*
+
+#...
+Disassembly of section \.text:
+#...
+.*:[ ]+[0-9a-f]+[ ]+jal[ ]+.* <foo_default@plt>
+.*:[ ]+[0-9a-f]+[ ]+jal[ ]+.* <foo_default@plt>
+
+0+[0-9a-f]+ <foo_default>:
+#...
diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.s b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.s
new file mode 100644
index 00000000000..46760f809df
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.s
@@ -0,0 +1,14 @@
+ .option nopic
+ .text
+ .align 1
+
+ call foo_default
+ jal foo_default
+
+
+ .globl foo_default
+ .type foo_default, @function
+foo_default:
+ nop
+ ret
+ .size foo_default, .-foo_default