[v2] LoongArch: Do not relax against __[start|stop]_SECNAME symbol
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_binutils_build--master-arm |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 |
success
|
Test passed
|
linaro-tcwg-bot/tcwg_binutils_check--master-arm |
success
|
Test passed
|
Commit Message
The value of the __[start|stop]_SECNAME symbol will be set after
loongarch_elf_relax_section. If relaxation is done against the
__[start|stop]_SECNAME symbol, the correct symbol value cannot
be obtained.
---
Changes from v1:
- Modify the test case to loongarch64 and check pie support.
---
bfd/elfnn-loongarch.c | 5 ++++-
ld/testsuite/ld-loongarch-elf/relax.exp | 3 +++
ld/testsuite/ld-loongarch-elf/start_stop.d | 13 +++++++++++++
ld/testsuite/ld-loongarch-elf/start_stop.s | 10 ++++++++++
4 files changed, 30 insertions(+), 1 deletion(-)
create mode 100644 ld/testsuite/ld-loongarch-elf/start_stop.d
create mode 100644 ld/testsuite/ld-loongarch-elf/start_stop.s
@@ -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
@@ -412,6 +412,8 @@ if [istarget loongarch64-*-*] {
"relax-segment-max" \
] \
]
+
+ run_dump_test "start_stop"
}
run_ld_link_tests \
@@ -484,4 +486,5 @@ if [istarget loongarch64-*-*] {
"uleb128" \
] \
]
+
}
new file mode 100644
@@ -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, .*
new file mode 100644
@@ -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