[PATCH v3] x86-64: Add GLIBC_ABI_GNU2_TLS version dependency

H.J. Lu hjl.tools@gmail.com
Sun Aug 17 18:34:42 GMT 2025


On Fri, Aug 15, 2025 at 6:10 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Linux/x86-64, programs and shared libraries compiled with
> -mtls-dialect=gnu2 may fail silently at run-time against glibc without
> the GNU2 TLS run-time fix for:
>
> https://sourceware.org/bugzilla/show_bug.cgi?id=31372
>
> A version tag, GLIBC_ABI_GNU2_TLS, has been added to glibc to indicate
> that glibc has the working GNU2 TLS run-time by:
>
> commit 9df8fa397d515dc86ff5565f6c45625e672d539e
> Author: H.J. Lu <hjl.tools@gmail.com>
> Date:   Mon Jul 28 12:18:22 2025 -0700
>
>     x86-64: Add GLIBC_ABI_GNU2_TLS version [BZ #33129]
>
> Add the --gnu2-tls-tag option to x86-64 ELF linker to add the
> GLIBC_ABI_GNU2_TLS version dependency in output programs and shared
> libraries when linking against glibc if input relocatable object files
> have R_X86_64_TLSDESC_CALL relocation.  The output will fail to load and
> run at run-time against glibc which doesn't define the GLIBC_ABI_GNU2_TLS
> version.
>
> Add the --enable-gnu2-tls-tag configure option to enable --gnu2-tls-tag
> by default.  If unspecified, linker will add the GLIBC_ABI_GNU2_TLS
> version dependency if inputs have R_X86_64_TLSDESC_CALL relocation and
> libc.so defines the GLIBC_ABI_GNU2_TLS version.
>
> bfd/
>
>         PR ld/33130
>         * elf-linker-x86.h (elf_linker_x86_params): Add gnu2_tls.
>         * elf64-x86-64.c (elf_x86_64_scan_relocs): Set has_tlsdesc_call
>         to 1 for R_X86_64_TLSDESC_CALL.
>         (elf_x86_64_add_glibc_version_dependency): Add GLIBC_ABI_GNU2_TLS
>         version dependency if GLIBC_ABI_GNU2_TLS dependency isn't disabled
>         and has_tlsdesc_call isn't 0.
>         * elflink.c (elf_link_add_glibc_verneed): Add a pointer to bool
>         argument, auto_version.  If *auto_version is true, add the
>         version dependency only if libc.so defines the version.
>         (_bfd_elf_link_add_glibc_version_dependency): Add a pointer to
>         bool argument and pass it to elf_link_add_glibc_verneed.
>         (_bfd_elf_link_add_dt_relr_dependency): Pass NULL to
>         _bfd_elf_link_add_glibc_version_dependency.
>         * elfxx-x86.h (elf_x86_link_hash_table): Add has_tlsdesc_call.
>
> ld/
>
>         PR ld/33130
>         * NEWS: Mention --gnu2-tls-tag, --no-gnu2-tls-tag and
>         --enable-gnu2-tls-tag.
>         * config.in: Regenerated.
>         * configure: Likewise.
>         * configure.ac: Add --enable-gnu2-tls-tag.
>         * ld.texi: Document --gnu2-tls-tag/--no-gnu2-tls-tag.
>         * ldlex.h (option_values): Add OPTION_GNU2_TLS_TAG and
>         OPTION_NO_GNU2_TLS_TAG.
>         * emulparams/elf32_x86_64.sh (EXTRA_EM_FILE): Changed to
>         "elf-x86-64".
>         * emulparams/elf_x86_64.sh (EXTRA_EM_FILE): Likewise.
>         * emultempl/elf-x86-64.em: New file.
>         * emultempl/elf-x86.em (elf_x86_64_before_parse): Removed.
>         (LDEMUL_BEFORE_PARSE): Likewise.
>         (elf_x86_64_before_allocation): Likewise.
>         * testsuite/ld-x86-64/gnu2-tls-1.rd: New file.
>         * testsuite/ld-x86-64/gnu2-tls-1a.od: New file.
>         * testsuite/ld-x86-64/gnu2-tls-1a.s: Likewise.
>         * testsuite/ld-x86-64/gnu2-tls-1b.od: Likewise.
>         * testsuite/ld-x86-64/gnu2-tls-1b.s: Likewise.
>         * testsuite/ld-x86-64/gnu2-tls-1c.od: Likewise.
>         * testsuite/ld-x86-64/gnu2-tls-2.rd: Likewise.
>         * testsuite/ld-x86-64/gnu2-tls-2.s: Likewise.
>         * testsuite/ld-x86-64/x86-64.exp: Run GLIBC_ABI_GNU2_TLS tests.
>

I sent out the v4 patch to properly add the GLIBC_2.36 version dependency
with a test when -z mark-plt -z nopack-relative-relocs passed to linker.

-- 
H.J.


More information about the Binutils mailing list