mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-26 04:31:03 +00:00
848746e88e
Add ELF_DYNAMIC_AFTER_RELOC to allow target specific processing after relocation. For x86-64, add #define DT_X86_64_PLT (DT_LOPROC + 0) #define DT_X86_64_PLTSZ (DT_LOPROC + 1) #define DT_X86_64_PLTENT (DT_LOPROC + 3) 1. DT_X86_64_PLT: The address of the procedure linkage table. 2. DT_X86_64_PLTSZ: The total size, in bytes, of the procedure linkage table. 3. DT_X86_64_PLTENT: The size, in bytes, of a procedure linkage table entry. With the r_addend field of the R_X86_64_JUMP_SLOT relocation set to the memory offset of the indirect branch instruction. Define ELF_DYNAMIC_AFTER_RELOC for x86-64 to rewrite the PLT section with direct branch after relocation when the lazy binding is disabled. PLT rewrite is disabled by default since SELinux may disallow modifying code pages and ld.so can't detect it in all cases. Use $ export GLIBC_TUNABLES=glibc.cpu.plt_rewrite=1 to enable PLT rewrite with 32-bit direct jump at run-time or $ export GLIBC_TUNABLES=glibc.cpu.plt_rewrite=2 to enable PLT rewrite with 32-bit direct jump and on APX processors with 64-bit absolute jump at run-time. Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
66 lines
2.0 KiB
Plaintext
66 lines
2.0 KiB
Plaintext
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
|
|
# Local configure fragment for sysdeps/x86_64.
|
|
|
|
dnl Check if -mprefer-vector-width=128 works.
|
|
AC_CACHE_CHECK(-mprefer-vector-width=128, libc_cv_cc_mprefer_vector_width, [dnl
|
|
LIBC_TRY_CC_OPTION([-mprefer-vector-width=128],
|
|
[libc_cv_cc_mprefer_vector_width=yes],
|
|
[libc_cv_cc_mprefer_vector_width=no])
|
|
])
|
|
LIBC_CONFIG_VAR([config-cflags-mprefer-vector-width],
|
|
[$libc_cv_cc_mprefer_vector_width])
|
|
|
|
LIBC_LINKER_FEATURE([-z mark-plt], [-Wl,-z,mark-plt],
|
|
[libc_cv_z_mark_plt=yes], [libc_cv_z_mark_plt=no])
|
|
LIBC_CONFIG_VAR([have-z-mark-plt], [$libc_cv_z_mark_plt])
|
|
|
|
if test x"$build_mathvec" = xnotset; then
|
|
build_mathvec=yes
|
|
fi
|
|
|
|
if test $enable_cet != no; then
|
|
# Check if CET can be enabled.
|
|
AC_CACHE_CHECK(whether CET can be enabled,
|
|
libc_cv_x86_cet_available, [dnl
|
|
cat > conftest.c <<EOF
|
|
#if !defined __CET__ || __CET__ != 3
|
|
# error CET isn't available.
|
|
#endif
|
|
EOF
|
|
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS -fcf-protection -include cet.h conftest.c 1>&AS_MESSAGE_LOG_FD); then
|
|
libc_cv_x86_cet_available=yes
|
|
else
|
|
libc_cv_x86_cet_available=no
|
|
fi
|
|
rm -rf conftest*])
|
|
if test $libc_cv_x86_cet_available != yes; then
|
|
AC_MSG_ERROR([$CC doesn't support CET])
|
|
fi
|
|
fi
|
|
if test $enable_cet != no; then
|
|
# Check if assembler supports CET.
|
|
AC_CACHE_CHECK(whether assembler supports CET,
|
|
libc_cv_x86_cet_as, [dnl
|
|
cat > conftest.s <<EOF
|
|
incsspd %ecx
|
|
EOF
|
|
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s -o conftest.o 1>&AS_MESSAGE_LOG_FD); then
|
|
libc_cv_x86_cet_as=yes
|
|
else
|
|
libc_cv_x86_cet_as=no
|
|
fi
|
|
rm -rf conftest*])
|
|
if test $libc_cv_x86_cet_as = no; then
|
|
AC_MSG_ERROR([$AS doesn't support CET])
|
|
fi
|
|
fi
|
|
if test $enable_cet = yes; then
|
|
AC_DEFINE(DEFAULT_DL_X86_CET_CONTROL, cet_elf_property)
|
|
elif test $enable_cet = permissive; then
|
|
AC_DEFINE(DEFAULT_DL_X86_CET_CONTROL, cet_permissive)
|
|
fi
|
|
LIBC_CONFIG_VAR([enable-cet], [$enable_cet])
|
|
|
|
test -n "$critic_missing" && AC_MSG_ERROR([
|
|
*** $critic_missing])
|