From: H.J. Lu Date: Thu, 14 Aug 2025 14:03:20 +0000 (-0700) Subject: x86-64: Add GLIBC_ABI_DT_X86_64_PLT [BZ #33212] X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fheads%2Frelease%2F2.41%2Fmaster;p=thirdparty%2Fglibc.git x86-64: Add GLIBC_ABI_DT_X86_64_PLT [BZ #33212] 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 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 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. Signed-off-by: H.J. Lu Reviewed-by: Sam James (cherry picked from commit 399384e0c8193e31aea014220ccfa24300ae5938) --- diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index 21f1ff1167..15fb72a952 100644 --- a/sysdeps/x86_64/Makefile +++ b/sysdeps/x86_64/Makefile @@ -212,6 +212,15 @@ 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 + tests-special += $(objpfx)check-gnu2-tls.out $(objpfx)check-gnu2-tls.out: $(common-objpfx)libc.so diff --git a/sysdeps/x86_64/Versions b/sysdeps/x86_64/Versions index a63c11bcb2..0a759029e5 100644 --- a/sysdeps/x86_64/Versions +++ b/sysdeps/x86_64/Versions @@ -10,6 +10,11 @@ libc { # by scripts/versions.awk. __placeholder_only_for_empty_version_map; } + 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 {