diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2025-08-14 07:03:20 -0700 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2025-08-18 01:06:14 +0100 |
commit | 11483721d60c200832462b4ed716cbed784eb035 (patch) | |
tree | 7598dbf4c3eebd260680d43d877fead1a62a267f | |
parent | 90db02ef73907d830b1d8d86d554ba35626b006f (diff) | |
download | glibc-release/2.34/master.zip glibc-release/2.34/master.tar.gz glibc-release/2.34/master.tar.bz2 |
x86-64: Add GLIBC_ABI_DT_X86_64_PLT [BZ #33212]release/2.34/master
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.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Sam James <sam@gentoo.org>
(cherry picked from commit 399384e0c8193e31aea014220ccfa24300ae5938)
-rw-r--r-- | sysdeps/x86_64/Makefile | 9 | ||||
-rw-r--r-- | sysdeps/x86_64/Versions | 5 |
2 files changed, 14 insertions, 0 deletions
diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index 22c5b63..8d40439 100644 --- a/sysdeps/x86_64/Makefile +++ b/sysdeps/x86_64/Makefile @@ -183,6 +183,15 @@ endif tests-internal += tst-x86-64-tls-1 +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 # $(subdir) == elf ifeq ($(subdir),csu) diff --git a/sysdeps/x86_64/Versions b/sysdeps/x86_64/Versions index e94758b..6a989ad 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 { |