[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