diff options
| author | H.J. Lu <hjl.tools@gmail.com> | 2024-10-29 06:01:14 +0800 |
|---|---|---|
| committer | H.J. Lu <hjl.tools@gmail.com> | 2024-11-22 06:22:13 +0800 |
| commit | e7b553272196e6175b8a15f807cb59217ba2843a (patch) | |
| tree | 61d06f2d421422ea5d8e14d93a1fa8395b541d3d /configure | |
| parent | 713d6d7e781ced6d194d6c147f2db4ce9961bb0c (diff) | |
| download | glibc-e7b553272196e6175b8a15f807cb59217ba2843a.tar.xz glibc-e7b553272196e6175b8a15f807cb59217ba2843a.zip | |
elf: Handle static PIE with non-zero load address [BZ #31799]
For a static PIE with non-zero load address, its PT_DYNAMIC segment
entries contain the relocated values for the load address in static PIE.
Since static PIE usually doesn't have PT_PHDR segment, use p_vaddr of
the PT_LOAD segment with offset == 0 as the load address in static PIE
and adjust the entries of PT_DYNAMIC segment in static PIE by properly
setting the l_addr field for static PIE. This fixes BZ #31799.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
Diffstat (limited to 'configure')
| -rwxr-xr-x | configure | 74 |
1 files changed, 74 insertions, 0 deletions
@@ -8107,6 +8107,80 @@ printf "%s\n" "$libc_cv_cc_pie_default" >&6; } config_vars="$config_vars cc-pie-default = $libc_cv_cc_pie_default" +# Get Position Dependent Executable (PDE) load address to be used to +# load static Position Independent Executable (PIE) at a known working +# non-zero load address. This is only used by glibc tests to verify +# that PIE and static PIE with non-zero load address work correctly. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking PDE load address" >&5 +printf %s "checking PDE load address... " >&6; } +if test ${libc_cv_pde_load_address+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat > conftest.S <<EOF +.globl _start +_start: +.globl __start +__start: +EOF +if test $libc_cv_cc_pie_default = yes; then + pde_ld_flags="-no-pie" +fi +if ${CC-cc} $pde_ld_flags $CFLAGS $CPPFLAGS $LDFLAGS \ + -nostartfiles -nostdlib $no_ssp \ + -o conftest conftest.S 1>&5 2>&5; then + # Get the load address of the first PT_LOAD segment. + libc_cv_pde_load_address=$(LC_ALL=C $READELF -Wl conftest \ + | $AWK '/LOAD/ { print $3; exit 0; }') +else + as_fn_error $? "${CC-cc} can not create PDE" "$LINENO" 5 +fi +rm -f conftest* ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_pde_load_address" >&5 +printf "%s\n" "$libc_cv_pde_load_address" >&6; } +config_vars="$config_vars +pde-load-address = $libc_cv_pde_load_address" + +# Get the linker command-line option to load executable at a non-zero +# load address. This is only used by glibc tests to verify that PIE and +# static PIE with non-zero load address work correctly. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker that supports -Ttext-segment=$libc_cv_pde_load_address" >&5 +printf %s "checking for linker that supports -Ttext-segment=$libc_cv_pde_load_address... " >&6; } +libc_linker_feature=no +cat > conftest.c <<EOF +int _start (void) { return 42; } +EOF +if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp + -Wl,-Ttext-segment=$libc_cv_pde_load_address -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=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then + if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,-Ttext-segment=$libc_cv_pde_load_address -nostdlib \ + -nostartfiles -fPIC -shared -o conftest.so conftest.c 2>&1 \ + | grep "warning: -Ttext-segment=$libc_cv_pde_load_address ignored" > /dev/null 2>&1; then + true + else + libc_linker_feature=yes + fi +fi +rm -f conftest* +if test $libc_linker_feature = yes; then + libc_cv_load_address_ldflag=-Wl,-Ttext-segment +else + libc_cv_load_address_ldflag= +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5 +printf "%s\n" "$libc_linker_feature" >&6; } +config_vars="$config_vars +load-address-ldflag = $libc_cv_load_address_ldflag" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can build programs as PIE" >&5 printf %s "checking if we can build programs as PIE... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext |
