diff options
author | Fangrui Song <maskray@google.com> | 2022-03-08 17:17:05 -0800 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2022-03-08 17:17:05 -0800 |
commit | 1c6cc29baf9a4c7129ab2e94b0d4022bfa4f3299 (patch) | |
tree | 008312335cd84ecfcc73c38b72ba836d06e3ca2f /configure | |
parent | edc696a73a7cb07b1aa68792a845a98d036ee7eb (diff) | |
download | glibc-1c6cc29baf9a4c7129ab2e94b0d4022bfa4f3299.tar.gz glibc-1c6cc29baf9a4c7129ab2e94b0d4022bfa4f3299.tar.xz glibc-1c6cc29baf9a4c7129ab2e94b0d4022bfa4f3299.zip |
elf: Support DT_RELR relative relocation format [BZ #27924] maskray/relr
PIE and shared objects usually have many relative relocations. In 2017/2018, SHT_RELR/DT_RELR was proposed on https://groups.google.com/g/generic-abi/c/bX460iggiKg/m/GxjM0L-PBAAJ ("Proposal for a new section type SHT_RELR") and is a pre-standard. RELR usually takes 3% or smaller space than R_*_RELATIVE relocations. The virtual memory size of a mostly statically linked PIE is typically 5~10% smaller. This patch adds ELF_DYNAMIC_DO_RELR to ELF_DYNAMIC_RELOCATE. ELF_DYNAMIC_DO_RELR is ordered before ELF_DYNAMIC_DO_REL[A] so that ifunc resolvers that require relocated got entries have them relocated. This is needed for ppc64 according to Alan Modra.
Diffstat (limited to 'configure')
-rwxr-xr-x | configure | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/configure b/configure index 8e5bee775a..c4e0d9e8e4 100755 --- a/configure +++ b/configure @@ -6115,6 +6115,43 @@ $as_echo "$libc_linker_feature" >&6; } config_vars="$config_vars have-depaudit = $libc_cv_depaudit" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports -z pack-relative-relocs" >&5 +$as_echo_n "checking for linker that supports -z pack-relative-relocs... " >&6; } +libc_linker_feature=no +if test x"$gnu_ld" = x"yes"; then + cat > conftest.c <<EOF +int _start (void) { return 42; } +EOF + if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp + -Wl,-z,pack-relative-relocs -nostdlib -nostartfiles + -fPIC -shared -o conftest.so conftest.c + 1>&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } + then + if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,-z,pack-relative-relocs -nostdlib \ + -nostartfiles -fPIC -shared -o conftest.so conftest.c 2>&1 \ + | grep "warning: -z pack-relative-relocs ignored" > /dev/null 2>&1; then + true + else + libc_linker_feature=yes + fi + fi + rm -f conftest* +fi +if test $libc_linker_feature = yes; then + libc_cv_relr=yes +else + libc_cv_relr=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5 +$as_echo "$libc_linker_feature" >&6; } +config_vars="$config_vars +have-relr = $libc_cv_relr" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports --no-dynamic-linker" >&5 $as_echo_n "checking for linker that supports --no-dynamic-linker... " >&6; } libc_linker_feature=no |