[PATCH 1/3] x86: Add GLIBC_ABI_GNU2_TLS version dependency
H.J. Lu
hjl.tools@gmail.com
Tue Aug 19 18:35:50 GMT 2025
On Mon, Aug 18, 2025 at 1:13 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Linux/x86, programs and shared libraries compiled with
> -mtls-dialect=gnu2 may fail silently at run-time against glibc without
> the GNU2 TLS run-time fixes for:
>
> https://sourceware.org/bugzilla/show_bug.cgi?id=31501
> 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. Add the --gnu2-tls-tag
> option to i386/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_386_TLS_DESC_CALL or
> 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 input object files have R_386_TLS_DESC_CALL or
> R_X86_64_TLSDESC_CALL relocation and libc.so defines the GLIBC_ABI_GNU2_TLS
> version.
>
> Update elf_link_add_glibc_verneed to properly add the GLIBC_2.36 version
> dependency when -z mark-plt -z nopack-relative-relocs passed to x86-64
> ELF linker.
>
> bfd/
>
> PR ld/33130
> * elf-bfd.h (_bfd_elf_link_add_glibc_version_dependency): Add
> a pointer to bool argument.
> * elf-linker-x86.h (elf_linker_x86_params): Add
> gnu2_tls_version_tag.
> * elf32-i386.c (elf_i386_scan_relocs): Set has_tls_desc_call to
> 1 for R_386_TLS_DESC_CALL.
> (elf_i386_add_glibc_version_dependency): New. Undef before
> FreeBSD support.
> * elf64-x86-64.c (elf_x86_64_scan_relocs): Set has_tls_desc_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.
Small update to use for x32. Also use elf_x86_64_add_glibc_version_dependency
for x32.
> * elflink.c (elf_link_add_glibc_verneed): Changed to return bool.
> Remove the pointer to elf_find_verdep_info argument. Add a
> pointer to bool argument, auto_version. Return true if linked
> against glibc. Otherwise return false. If the version dependency
> is added, set *auto_version to true. 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.
> (elf_backend_add_glibc_version_dependency): Undef before CloudABI
> support.
> * elfxx-x86.h (elf_x86_link_hash_table): Add has_tls_desc_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_VERSION_TAG and
> OPTION_NO_GNU2_TLS_VERSION_TAG.
> * emulparams/elf32_x86_64.sh (EXTRA_EM_FILE): Changed to
> "elf-x86-64-glibc".
> * emulparams/elf_i386.sh (EXTRA_EM_FILE): Set to "elf-i386-glibc".
> * emulparams/elf_i386_fbsd.sh (EXTRA_EM_FILE): New. Set to
> "elf-x86".
> * emulparams/elf_i386_haiku.sh (EXTRA_EM_FILE): Likewise.
> * emulparams/elf_x86_64.sh (EXTRA_EM_FILE): Likewise.
> * emulparams/elf_x86_64_cloudabi.sh (EXTRA_EM_FILE): New. Set
> to "elf-x86-64".
> * emulparams/elf_x86_64_fbsd.sh (EXTRA_EM_FILE): Likewise.
> * emulparams/elf_x86_64_haiku.sh (EXTRA_EM_FILE): Likewise.
> * (EXTRA_EM_FILE): Likewise.
> * (EXTRA_EM_FILE): Likewise.
> * emultempl/elf-i386-glibc.em: New file.
> * emultempl/elf-x86-64-glibc.em: Likewise.
> * emultempl/elf-x86-64.em: Likewise.
> * emultempl/elf-x86-glibc.em: Likewise.
> * emultempl/elf-x86.em (elf_x86_64_before_parse): Removed.
> (LDEMUL_BEFORE_PARSE): Likewise.
> (elf_x86_64_before_allocation): Likewise.
> (LDEMUL_BEFORE_ALLOCATION): Likewise.
> * emultempl/solaris2-x86-64.em: New file.
> * testsuite/ld-i386/gnu2-tls-1.s: Likewise.
> * testsuite/ld-i386/gnu2-tls-1a.rd: Likewise.
> * testsuite/ld-i386/gnu2-tls-1b.rd: Likewise.
> * testsuite/ld-x86-64/gnu2-tls-1.s: Likewise.
> * testsuite/ld-x86-64/gnu2-tls-1a.rd: Likewise.
> * testsuite/ld-x86-64/gnu2-tls-1b.rd: Likewise.
> * testsuite/ld-x86-64/mark-plt-2.rd: Likewise.
> * testsuite/ld-x86-64/mark-plt-2.s: Likewise.
> * testsuite/ld-i386/i386.exp: Run GLIBC_ABI_GNU2_TLS tests.
> * testsuite/ld-x86-64/x86-64.exp: Likewise.
>
--
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-x86-Add-GLIBC_ABI_GNU2_TLS-version-dependency.patch
Type: text/x-patch
Size: 46302 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20250819/d21bc598/attachment-0001.bin>
More information about the Binutils
mailing list