[PATCH v1] LoongArch: Do not relax against __[start|stop]_SECNAME symbol
Lulu Cai
cailulu@loongson.cn
Tue Jan 28 09:05:05 GMT 2025
Hi Nick,
This patch fixes a relaxation bug for LoongArch and needs to be
applied to 2.44 branch and the mainline source.
link: https://sourceware.org/pipermail/binutils/2025-January/138943.html
Thanks.
On 1/22/2025 5:00 PM, Lulu Cai wrote:
> 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.
> ---
> 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(-)
> create mode 100644 ld/testsuite/ld-loongarch-elf/start_stop.d
> create mode 100644 ld/testsuite/ld-loongarch-elf/start_stop.s
>
> diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
> index efa57184e44..dfb760dbf22 100644
> --- a/bfd/elfnn-loongarch.c
> +++ b/bfd/elfnn-loongarch.c
> @@ -5636,10 +5636,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..5c17a2ef403 100644
> --- a/ld/testsuite/ld-loongarch-elf/relax.exp
> +++ b/ld/testsuite/ld-loongarch-elf/relax.exp
> @@ -484,4 +484,6 @@ if [istarget loongarch64-*-*] {
> "uleb128" \
> ] \
> ]
> +
> + run_dump_test "start_stop"
> }
> 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
mailing list