[PATCH] x86-64: Add GLIBC_ABI_DT_X86_64_PLT [BZ #33212]

Sam James sam@gentoo.org
Thu Aug 14 13:19:11 GMT 2025


"H.J. Lu" <hjl.tools@gmail.com> writes:

> When the linker -z mark-plt option is used to add DT_X86_64_PLT,
> DT_X86_64_PLTSZ and DT_X86_64_PLTENT, the r_addend field of the
> R_X86_64_JUMP_SLOT relocation stores the offset of the indirect
> branch instruction.  However, glibc versions without the commit:
>
> commit f8587a61892cbafd98ce599131bf4f103466f084
> Author: H.J. Lu <hjl.tools@gmail.com>
> Date:   Fri May 20 19:21:48 2022 -0700
>
>     x86-64: Ignore r_addend for R_X86_64_GLOB_DAT/R_X86_64_JUMP_SLOT
>
>     According to x86-64 psABI, r_addend should be ignored for R_X86_64_GLOB_DAT
>     and R_X86_64_JUMP_SLOT.  Since linkers always set their r_addends to 0, we
>     can ignore their r_addends.
>
>     Reviewed-by: Fangrui Song <maskray@google.com>
>
> won't ignore the r_addend value in the R_X86_64_JUMP_SLOT relocation.
> Such programs and shared libraries will fail at run-time randomly.
>
> Add GLIBC_ABI_DT_X86_64_PLT version to indicate that glibc is compatible
> with DT_X86_64_PLT.
>
> The linker can add the glibc GLIBC_ABI_DT_X86_64_PLT version dependency
> whenever -z mark-plt is passed to the linker.  The resulting programs and
> shared libraries will fail to load at run-time against libc.so without the
> GLIBC_ABI_DT_X86_64_PLT version, instead of fail randomly.
>
> This fixes BZ #33212.
>

Sorry, I thought this had landed. It both looks good to me and Carlos
acked it on the bug too.

Reviewed-by: Sam James <sam@gentoo.org>

> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> ---
>  sysdeps/x86_64/Makefile | 9 +++++++++
>  sysdeps/x86_64/Versions | 5 +++++
>  2 files changed, 14 insertions(+)
>
> diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile
> index c3e1065c81..fe9f1cdddb 100644
> --- a/sysdeps/x86_64/Makefile
> +++ b/sysdeps/x86_64/Makefile
> @@ -212,6 +212,15 @@ LDFLAGS-tst-plt-rewrite2 = -Wl,-z,now
>  LDFLAGS-tst-plt-rewritemod2.so = -Wl,-z,now,-z,undefs
>  tst-plt-rewrite2-ENV = GLIBC_TUNABLES=glibc.cpu.plt_rewrite=2
>  $(objpfx)tst-plt-rewrite2: $(objpfx)tst-plt-rewritemod2.so
> +
> +tests-special += $(objpfx)check-dt-x86-64-plt.out
> +
> +$(objpfx)check-dt-x86-64-plt.out: $(common-objpfx)libc.so
> +	LC_ALL=C $(READELF) -V -W $< \
> +		| sed -ne '/.gnu.version_d/, /.gnu.version_r/ p' \
> +		| grep GLIBC_ABI_DT_X86_64_PLT > $@; \
> +	$(evaluate-test)
> +generated += check-dt-x86-64-plt.out
>  endif
>  
>  test-internal-extras += tst-gnu2-tls2mod1
> diff --git a/sysdeps/x86_64/Versions b/sysdeps/x86_64/Versions
> index e94758b236..6a989ad3b3 100644
> --- a/sysdeps/x86_64/Versions
> +++ b/sysdeps/x86_64/Versions
> @@ -5,6 +5,11 @@ libc {
>    GLIBC_2.13 {
>      __fentry__;
>    }
> +  GLIBC_ABI_DT_X86_64_PLT {
> +    # This symbol is used only for empty version map and will be removed
> +    # by scripts/versions.awk.
> +    __placeholder_only_for_empty_version_map;
> +  }
>  }
>  libm {
>    GLIBC_2.1 {


More information about the Libc-alpha mailing list