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

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


On Sun, Aug 17, 2025 at 11:34 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> 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.
>

I sent out the v4 patch to add:


diff --git a/bfd/elflink.c b/bfd/elflink.c
index a9800bd7f4b..ac40423751f 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -2389,6 +2389,8 @@ elf_link_add_glibc_verneed (struct
elf_find_verdep_info *rinfo,

   t->vn_auxptr = a;

+  added = true;
+
  update_auto_version_and_return:
   if (auto_version)
     *auto_version = added;

-- 
H.J.


More information about the Binutils mailing list