[PATCH v2 2/3] ld: Pin the hash style in the LoongArch DT_RELR shared tests
mengqinggang
mengqinggang@loongson.cn
Thu Sep 10 03:57:34 GMT 2026
LGTM, thanks!
在 2026/9/9 15:09, mintsuki 写道:
> These three tests match .rela.dyn entries with the symbol index of
> r_info written out in full, and that index depends on the default hash
> style. A GNU hash table requires the undefined symbols to precede the
> defined ones in .dynsym, so an undefined weak in these tests sorts to
> index 2 with --hash-style=both or gnu, and to the end of the table with
> sysv. The expectations were written against the linux default of
> "both"; the default for a bare-metal target is sysv, where the same
> three relocations come out correct but against different indices.
>
> The tests are unsupported on loongarch*-elf today, so this changes
> nothing yet; it is needed by the following patch, which enables shared
> library and PIE support for that target and so lets them run. Pinning
> the hash style rather than relaxing the expectation keeps them strict,
> and matches what a good number of tests elsewhere in the testsuite
> already do.
>
> ld/
> * testsuite/ld-loongarch-elf/relr-data-shared.d: Pass
> --hash-style=both.
> * testsuite/ld-loongarch-elf/relr-discard-shared.d: Likewise.
> * testsuite/ld-loongarch-elf/relr-got-shared.d: Likewise.
>
> Assisted-by: Claude:claude-opus-5
> Signed-off-by: Mintsuki <mintsuki@protonmail.com>
> ---
> ld/testsuite/ld-loongarch-elf/relr-data-shared.d | 2 +-
> ld/testsuite/ld-loongarch-elf/relr-discard-shared.d | 2 +-
> ld/testsuite/ld-loongarch-elf/relr-got-shared.d | 2 +-
> 3 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/ld/testsuite/ld-loongarch-elf/relr-data-shared.d b/ld/testsuite/ld-loongarch-elf/relr-data-shared.d
> index 37e4c0da..81eaa577 100644
> --- a/ld/testsuite/ld-loongarch-elf/relr-data-shared.d
> +++ b/ld/testsuite/ld-loongarch-elf/relr-data-shared.d
> @@ -1,5 +1,5 @@
> #source: relr-data.s
> -#ld: -shared -z pack-relative-relocs -T relr-relocs.ld
> +#ld: -shared -z pack-relative-relocs --hash-style=both -T relr-relocs.ld
> #readelf: -rW
>
> Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 6 entries:
> diff --git a/ld/testsuite/ld-loongarch-elf/relr-discard-shared.d b/ld/testsuite/ld-loongarch-elf/relr-discard-shared.d
> index 8bfd8ba5..7456793c 100644
> --- a/ld/testsuite/ld-loongarch-elf/relr-discard-shared.d
> +++ b/ld/testsuite/ld-loongarch-elf/relr-discard-shared.d
> @@ -1,5 +1,5 @@
> #source: relr-discard.s
> -#ld: -shared -z pack-relative-relocs -T relr-discard.ld
> +#ld: -shared -z pack-relative-relocs --hash-style=both -T relr-discard.ld
> #readelf: -rW
>
> Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 1 entry:
> diff --git a/ld/testsuite/ld-loongarch-elf/relr-got-shared.d b/ld/testsuite/ld-loongarch-elf/relr-got-shared.d
> index 169e0e5d..1c0d2b91 100644
> --- a/ld/testsuite/ld-loongarch-elf/relr-got-shared.d
> +++ b/ld/testsuite/ld-loongarch-elf/relr-got-shared.d
> @@ -1,5 +1,5 @@
> #source: relr-got.s
> -#ld: -shared -z pack-relative-relocs -T relr-relocs.ld
> +#ld: -shared -z pack-relative-relocs --hash-style=both -T relr-relocs.ld
> #readelf: -rW
>
> Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 3 entries:
> --
> 2.55.0
>
>
> On Wednesday, September 9th, 2026 at 9:04 AM, mintsuki <mintsuki@protonmail.com> wrote:
>
>> ld refuses both -shared and -pie for riscv*-elf and loongarch*-elf,
>> because their emulparams files withhold GENERATE_SHLIB_SCRIPT and
>> GENERATE_PIE_SCRIPT from those two targets specifically. This is not
>> the EMBEDDED policy at work -- neither file sets EMBEDDED -- but a pair
>> of one-off "case $target" checks: be1dce26256a for RISC-V, copied into
>> the LoongArch port from it. Other bare-metal ELF targets generate the
>> scripts; aarch64*-elf was given PIE support on purpose in 3af09e8db308,
>> and f2aaebdb9797, which would have taken it away from EMBEDDED targets
>> generally, was reverted in 8a46e447a88d:
>>
>> https://inbox.sourceware.org/binutils/20191108103411.GU6708@bubble.grove.modra.org/
>>
>> What this blocks in practice is freestanding relocatable outputs.
>> Those need -pie (or, alternatively, -shared -Bsymbolic), as already
>> supported by x86_64-elf, i686-elf, aarch64-elf, etc...
>> On riscv64-elf and loongarch64-elf compilers accept -fPIE and -fPIC,
>> but the link step using ld.bfd dies with "-pie not supported" or
>> "-shared not supported", so a bare-metal toolchain, that is otherwise
>> complete, cannot build a freestanding relocatable output. A *-linux
>> (or otherwise other hosted) ld.bfd (or LLVM's lld) has to be used
>> for the link step instead.
>>
>> Patch 2 is testsuite preparation. Three LoongArch DT_RELR tests write
>> out the symbol index of r_info in full, and that index depends on the
>> default hash style: GNU hash requires undefined symbols to precede
>> defined ones in .dynsym, so an undefined weak in those tests sorts to
>> index 2 under the linux default of "both" and to the end of the table
>> under the bare-metal default of sysv. The relocations themselves are
>> correct either way. Without that patch, patch 3 turns those three from
>> unsupported into FAIL.
>>
>> Based on 2986ed8ba365 ("Constify targ_desc"). Tested with gcc 16.2.0
>> riscv64-elf and loongarch64-elf toolchains and dejagnu 1.6.3.
>> make check-ld, before and after the series:
>>
>> riscv64-elf 541 -> 763 passes, 0 unexpected failures either way
>> loongarch64-elf 540 -> 703 passes, 0 unexpected failures either way
>>
>> No test regresses on either target, and there are no unexpected
>> successes; the increase is the shared and PIE tests that were previously
>> skipped now running. I have not tested the 32-bit variants, riscv32-elf
>> and loongarch32-elf, which the same emulparams files cover.
>>
>> Mintsuki (3):
>> RISC-V: Enable shared library and PIE support for riscv*-elf
>> ld: Pin the hash style in the LoongArch DT_RELR shared tests
>> LoongArch: Enable shared library and PIE support for loongarch*-elf
>>
>> ld/emulparams/elf32loongarch-defs.sh | 11 ++---------
>> ld/emulparams/elf32lriscv-defs.sh | 11 ++---------
>> ld/emulparams/elf64loongarch-defs.sh | 11 ++---------
>> ld/testsuite/ld-loongarch-elf/relr-data-shared.d | 2 +-
>> ld/testsuite/ld-loongarch-elf/relr-discard-shared.d | 2 +-
>> ld/testsuite/ld-loongarch-elf/relr-got-shared.d | 2 +-
>> 6 files changed, 9 insertions(+), 30 deletions(-)
>>
More information about the Binutils
mailing list