[binutils-gdb] LoongArch: Do not relax against __[start|stop]_SECNAME symbol

Nick Clifton nickc@sourceware.org
Fri Jan 31 10:38:18 GMT 2025


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

commit a73d90470092efd6cb58df7076e2b50507f067b6
Author: Lulu Cai <cailulu@loongson.cn>
Date:   Fri Jan 31 10:37:50 2025 +0000

    LoongArch: Do not relax against __[start|stop]_SECNAME symbol

Diff:
---
 bfd/elfnn-loongarch.c                      |  5 ++++-
 ld/testsuite/ld-loongarch-elf/relax.exp    |  2 ++
 ld/testsuite/ld-loongarch-elf/start_stop.d | 13 +++++++++++++
 ld/testsuite/ld-loongarch-elf/start_stop.s | 10 ++++++++++
 4 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index c24b2600a9a..0e3bfac67f6 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -5637,10 +5637,13 @@ loongarch_elf_relax_section (bfd *abfd, asection *sec,
 	}
       else
 	{
+	  /* Do not relax __[start|stop]_SECNAME, since the symbol value
+	     is not set yet.  */
 	  if (h != NULL
 	      && ((h->type == STT_GNU_IFUNC
 		   && r_type != R_LARCH_CALL36)
-		  || bfd_is_abs_section (h->root.u.def.section)))
+		  || bfd_is_abs_section (h->root.u.def.section)
+		  || h->start_stop))
 	    continue;
 
 	  /* The GOT entry of tls symbols must in current execute file or
diff --git a/ld/testsuite/ld-loongarch-elf/relax.exp b/ld/testsuite/ld-loongarch-elf/relax.exp
index 81924cd35cb..49e6b23b606 100644
--- a/ld/testsuite/ld-loongarch-elf/relax.exp
+++ b/ld/testsuite/ld-loongarch-elf/relax.exp
@@ -412,6 +412,8 @@ if [istarget loongarch64-*-*] {
 		  "relax-segment-max" \
 	      ] \
 	  ]
+
+     run_dump_test "start_stop"
     }
 
     run_ld_link_tests \
diff --git a/ld/testsuite/ld-loongarch-elf/start_stop.d b/ld/testsuite/ld-loongarch-elf/start_stop.d
new file mode 100644
index 00000000000..b887dcc2eb7
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/start_stop.d
@@ -0,0 +1,13 @@
+#ld: -z norelro -pie -e0
+#objdump: -d
+
+.*:     file format .*
+
+
+Disassembly of section sec1:
+
+[0-9a-f]+ <_start>:
+ [0-9a-f]+:	[0-9a-f]+ 	pcalau12i   	\$a0, .*
+ [0-9a-f]+:	[0-9a-f]+ 	ld.d        	\$a0, \$a0, .*
+ [0-9a-f]+:	[0-9a-f]+ 	pcalau12i   	\$a0, .*
+ [0-9a-f]+:	[0-9a-f]+ 	ld.d        	\$a0, \$a0, .*
diff --git a/ld/testsuite/ld-loongarch-elf/start_stop.s b/ld/testsuite/ld-loongarch-elf/start_stop.s
new file mode 100644
index 00000000000..f50bc603abb
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/start_stop.s
@@ -0,0 +1,10 @@
+	.section	sec1,"ax",@progbits
+	.globl	_start
+	.type   _start, @function
+_start:
+	la.got	$a0,__start_sec1
+	la.got	$a0,__stop_sec1
+	.size   _start, .-_start
+
+	.hidden	__start_sec1
+	.hidden	__stop_sec1


More information about the Binutils-cvs mailing list