[binutils-gdb] LoongArch: Fix wrong relocation handling of symbols defined by PROVIDE

liu & zhensong liuzhensong@sourceware.org
Mon Aug 26 09:26:52 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=05b3e96495386ee41358c68b8787274ce77ae049

commit 05b3e96495386ee41358c68b8787274ce77ae049
Author: Lulu Cai <cailulu@loongson.cn>
Date:   Fri Aug 9 17:40:59 2024 +0800

    LoongArch: Fix wrong relocation handling of symbols defined by PROVIDE
    
    If the symbol defined by PROVIDE in the link script is not in SECTION,
    the symbol is placed in the ABS section. The linker considers that
    symbols in the ABS section do not need to calculate PC relative offsets.
    
    Symbols in ABS sections should calculate PC relative offsets normally
    based on relocations.

Diff:
---
 bfd/elfnn-loongarch.c                              |  2 +-
 ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp |  3 +++
 ld/testsuite/ld-loongarch-elf/provide_abs.d        | 12 ++++++++++++
 ld/testsuite/ld-loongarch-elf/provide_abs.ld       |  1 +
 ld/testsuite/ld-loongarch-elf/provide_noabs.d      | 13 +++++++++++++
 ld/testsuite/ld-loongarch-elf/provide_noabs.ld     |  7 +++++++
 ld/testsuite/ld-loongarch-elf/provide_sym.s        |  7 +++++++
 7 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index f58ced30ac3..6de101b35f7 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -3313,7 +3313,7 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
       /* The r_symndx will be STN_UNDEF (zero) only for relocs against symbols
 	 from removed linkonce sections, or sections discarded by a linker
 	 script.  Also for R_*_SOP_PUSH_ABSOLUTE and PCREL to specify const.  */
-      if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
+      if (r_symndx == STN_UNDEF)
 	{
 	  defined_local = false;
 	  resolved_local = false;
diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
index d80014d9563..4328f6e941e 100644
--- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
+++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
@@ -184,5 +184,8 @@ if [istarget "loongarch64-*-*"] {
   run_dump_test "ie-le-relax"
   run_dump_test "tlsdesc_abs"
   run_dump_test "tlsdesc_extreme"
+  run_dump_test "provide_abs"
+  run_dump_test "provide_noabs"
+
 }
 
diff --git a/ld/testsuite/ld-loongarch-elf/provide_abs.d b/ld/testsuite/ld-loongarch-elf/provide_abs.d
new file mode 100644
index 00000000000..1514fb18b01
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_abs.d
@@ -0,0 +1,12 @@
+#source: provide_sym.s
+#as:
+#ld: -T provide_abs.ld
+#objdump: -d
+
+.*: +file format .*
+
+#...
+   0:	58001085 	beq         	\$a0, \$a1, 16	# 10 <fun1>
+   4:	40000c80 	beqz        	\$a0, 12	# 10 <fun1>
+   8:	54000800 	bl          	8	# 10 <fun1>
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/provide_abs.ld b/ld/testsuite/ld-loongarch-elf/provide_abs.ld
new file mode 100644
index 00000000000..473476cdc65
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_abs.ld
@@ -0,0 +1 @@
+PROVIDE(fun1 = 0x10);
diff --git a/ld/testsuite/ld-loongarch-elf/provide_noabs.d b/ld/testsuite/ld-loongarch-elf/provide_noabs.d
new file mode 100644
index 00000000000..7d6bc4d1baf
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_noabs.d
@@ -0,0 +1,13 @@
+#source: provide_sym.s
+#as:
+#ld: -T provide_noabs.ld
+#objdump: -d
+
+.*: +file format .*
+
+
+#...
+   0:	58001085 	beq         	\$a0, \$a1, 16	# 10 <fun1>
+   4:	40000c80 	beqz        	\$a0, 12	# 10 <fun1>
+   8:	54000800 	bl          	8	# 10 <fun1>
+#pass
diff --git a/ld/testsuite/ld-loongarch-elf/provide_noabs.ld b/ld/testsuite/ld-loongarch-elf/provide_noabs.ld
new file mode 100644
index 00000000000..0154c6f3a29
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_noabs.ld
@@ -0,0 +1,7 @@
+SECTIONS
+{
+  .text :
+  {
+    PROVIDE(fun1 = 0x10);
+  }
+}
diff --git a/ld/testsuite/ld-loongarch-elf/provide_sym.s b/ld/testsuite/ld-loongarch-elf/provide_sym.s
new file mode 100644
index 00000000000..6610894edbe
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/provide_sym.s
@@ -0,0 +1,7 @@
+	.text
+	.globl	main
+	.type	main, @function
+main:
+	beq	$a0,$a1,%b16(fun1)
+	beqz	$a0,%b21(fun1)
+	bl	%b26(fun1)


More information about the Binutils-cvs mailing list