aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authormengqinggang <mengqinggang@loongson.cn>2022-12-01 17:23:14 +0800
committerliuzhensong <liuzhensong@loongson.cn>2024-01-04 19:08:53 +0800
commite493ba6255aec08885affbb68ddc0a025583d528 (patch)
tree907c8311ad1cef9bf1233eb73685c9e10dfbb657 /ld
parentb7a5722ebdd24a0d15d56e96d30a649ea1d7b0ee (diff)
downloadgdb-e493ba6255aec08885affbb68ddc0a025583d528.zip
gdb-e493ba6255aec08885affbb68ddc0a025583d528.tar.gz
gdb-e493ba6255aec08885affbb68ddc0a025583d528.tar.bz2
LoongArch: Fix linker generate PLT entry for data symbol
With old "medium" code model, we call a function with a pair of PCALAU12I and JIRL instructions. The assembler produces something like: 8: 1a00000c pcalau12i $t0, 0 8: R_LARCH_PCALA_HI20 g c: 4c000181 jirl $ra, $t0, 0 c: R_LARCH_PCALA_LO12 g The linker generates a "PLT entry" for data without any diagnostic. If "g" is a data symbol and ld with -shared option, it may load two instructions in the PLT. Without -shared option, loongarch_elf_adjust_dynamic_symbol can delete PLT entry. For R_LARCH_PCALA_HI20 relocation, linker only generate PLT entry for STT_FUNC and STT_GNU_IFUNC symbols.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ld-loongarch-elf/data-plt.s20
-rw-r--r--ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp24
-rw-r--r--ld/testsuite/ld-loongarch-elf/libjirl.s1
3 files changed, 45 insertions, 0 deletions
diff --git a/ld/testsuite/ld-loongarch-elf/data-plt.s b/ld/testsuite/ld-loongarch-elf/data-plt.s
new file mode 100644
index 0000000..faff052
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/data-plt.s
@@ -0,0 +1,20 @@
+# The first version medium codel model function call is: pcalau12i + jirl.
+# R_LARCH_PCALA_HI20 only need to generate PLT entry for function symbols.
+ .text
+ .globl a
+
+ .data
+ .align 2
+ .type a, @object
+ .size a, 4
+a:
+ .word 1
+
+ .text
+ .align 2
+ .globl test
+ .type test, @function
+test:
+ pcalau12i $r12,%pc_hi20(a)
+ ld.w $r12,$r12,%pc_lo12(a)
+ .size test, .-test
diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
index 8dc04fe..64e644d 100644
--- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
+++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
@@ -59,6 +59,30 @@ if [istarget "loongarch64-*-*"] {
]
}
+ # loongarch*-elf target do not support -shared option
+ if [check_shared_lib_support] {
+ run_ld_link_tests \
+ [list \
+ [list \
+ "data plt" \
+ "-shared" "" \
+ "" \
+ {data-plt.s} \
+ {} \
+ "data-plt.so" \
+ ] \
+ ]
+
+ if [file exist "tmpdir/data-plt.so"] {
+ set objdump_output [run_host_cmd "objdump" "-d tmpdir/data-plt.so"]
+ if { [ regexp "<a@plt>" $objdump_output] } {
+ fail "data plt"
+ } {
+ pass "data plt"
+ }
+ }
+ }
+
run_ld_link_tests \
[list \
[list \
diff --git a/ld/testsuite/ld-loongarch-elf/libjirl.s b/ld/testsuite/ld-loongarch-elf/libjirl.s
index 4d96387..de028c5 100644
--- a/ld/testsuite/ld-loongarch-elf/libjirl.s
+++ b/ld/testsuite/ld-loongarch-elf/libjirl.s
@@ -1,2 +1,3 @@
+.type func @function
pcalau12i $r12, %pc_hi20(func)
jirl $r1,$r12, %pc_lo12(func)