This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PING: [PATCH] Add --enable-static-pie to build static PIE


On Fri, Sep 1, 2017 at 10:49 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> --enable-static-pie configures glibc to compile libc.a as PIE and
> creates static executables as PIE.  A static position independent
> executable (static PIE) is similar to static executable, but can be
> loaded at any address without help from a dynamic linker.  All linker
> input files must be compiled with -fpie or -fPIE.  "-z text" is also
> passed to linker to prevent dynamic relocations in read-only segments.
> It passes -static-pie to the GCC driver with the patch:
>
> https://gcc.gnu.org/ml/gcc-patches/2017-08/msg01455.html
>
> This patch requires:
>
> 1. Linker supports --no-dynamic-linker to remove PT_INTERP segment from
> static PIE.
> 2. Linker can create working static PIE.  The x86-64 linker needs the
> fix for
>
> https://sourceware.org/bugzilla/show_bug.cgi?id=21782
>
> Binutils 2.29 or above are OK.
>
> Tested on i686 and x86-64.
>
> OK for master?
>
> H.J.
> ---
>         * Makeconfig (pic-default): Updated for --enable-static-pie.
>         (pie-default): New for --enable-static-pie.
>         (default-pie-ldflag): Likewise.
>         (+link-static-before-libc): Add $(default-pie-ldflag).
>         (+prectorT): Updated for --enable-static-pie.
>         (+postctorT): Likewise.
>         (CFLAGS-.o): Add $(pie-default).
>         (CFLAGS-.op): Likewise.
>         * config.h.in (ENABLE_STATIC_PIE): New.
>         * configure.ac (--enable-static-pie): New configure option.
>         (have-no-dynamic-linker): New LIBC_CONFIG_VAR.
>         (have-static-pie): Likewise.
>         Enable static PIE if linker supports --no-dynamic-linker.
>         (ENABLE_STATIC_PIE): New AC_DEFINE.
>         (enable-static-pie): New LIBC_CONFIG_VAR.
>         * configure: Regenerated.
>         * csu/libc-start.c (LIBC_START_MAIN): Call _dl_relocate_static_pie
>         in libc.a.
>         * csu/libc-tls.c (__libc_setup_tls): Add main_map->l_addr to
>         initimage.
>         * elf/dl-support.c: Include "dynamic-link.h" and don't include
>         "get-dynamic-info.h" for --enable-static-pie.
>         (_dl_relocate_static_pie): New function for --enable-static-pie.
>         (STATIC_PIE_BOOTSTRAP): New for --enable-static-pie.
>         (RESOLVE_MAP): Likewise.
>         * elf/dynamic-link.h (ELF_DURING_STARTUP): Also check
>         STATIC_PIE_BOOTSTRAP.
>         * elf/get-dynamic-info.h (elf_get_dynamic_info): Likewise.
>         * sysdeps/generic/ldsodefs.h (_dl_relocate_static_pie): New.
>         * sysdeps/x86_64/configure.ac: Check if linker supports static PIE.
>         * sysdeps/x86_64/configure: Regenerated.
> ---
>  Makeconfig                  | 20 ++++++++++--
>  config.h.in                 |  3 ++
>  configure                   | 78 +++++++++++++++++++++++++++++++++++++++++++++
>  configure.ac                | 29 +++++++++++++++++
>  csu/libc-start.c            |  2 ++
>  csu/libc-tls.c              |  6 ++--
>  elf/dl-support.c            | 39 +++++++++++++++++++++--
>  elf/dynamic-link.h          |  2 +-
>  elf/get-dynamic-info.h      |  6 ++--
>  sysdeps/generic/ldsodefs.h  |  7 ++++
>  sysdeps/x86_64/configure    | 33 +++++++++++++++++++
>  sysdeps/x86_64/configure.ac | 22 +++++++++++++
>  12 files changed, 237 insertions(+), 10 deletions(-)
>
> diff --git a/Makeconfig b/Makeconfig
> index b51904b797..b45209fe5f 100644
> --- a/Makeconfig
> +++ b/Makeconfig
> @@ -386,6 +386,16 @@ LDFLAGS.so += $(hashstyle-LDFLAGS)
>  LDFLAGS-rtld += $(hashstyle-LDFLAGS)
>  endif
>
> +ifeq (yes,$(enable-static-pie))
> +pic-default = -DPIC
> +pie-default = $(pie-ccflag)
> +ifeq (yes,$(have-static-pie))
> +default-pie-ldflag = -static-pie
> +else
> +default-pie-ldflag = -Wl,-pie,--no-dynamic-linker,--eh-frame-hdr,-z,text
> +endif
> +endif
> +
>  # If lazy relocations are disabled, add the -z now flag.  Use
>  # LDFLAGS-lib.so instead of LDFLAGS.so, to avoid adding the flag to
>  # test modules.
> @@ -435,6 +445,7 @@ endif
>  # Command for statically linking programs with the C library.
>  ifndef +link-static
>  +link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
> +             $(default-pie-ldflag) \
>               $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F))  \
>               $(addprefix $(csu-objpfx),$(static-start-installed-name)) \
>               $(+preinit) $(+prectorT) \
> @@ -651,8 +662,13 @@ endif
>  +prectorS = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtbeginS.o`
>  +postctorS = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtendS.o`
>  # Variants of the two previous definitions for statically linking programs.
> +ifeq (yes,$(enable-static-pie))
> ++prectorT = $(+prectorS)
> ++postctorT = $(+postctorS)
> +else
>  +prectorT = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtbeginT.o`
>  +postctorT = `$(CC) $(sysdep-LDFLAGS) --print-file-name=crtend.o`
> +endif
>  csu-objpfx = $(common-objpfx)csu/
>  elf-objpfx = $(common-objpfx)elf/
>
> @@ -973,7 +989,7 @@ libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o))
>  all-object-suffixes := .o .os .oS
>  object-suffixes :=
>  CPPFLAGS-.o = $(pic-default)
> -CFLAGS-.o = $(filter %frame-pointer,$(+cflags))
> +CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) $(pie-default)
>  libtype.o := lib%.a
>  object-suffixes += .o
>  ifeq (yes,$(build-shared))
> @@ -998,7 +1014,7 @@ ifeq (yes,$(build-profile))
>  all-object-suffixes += .op
>  object-suffixes += .op
>  CPPFLAGS-.op = -DPROF $(pic-default)
> -CFLAGS-.op = -pg
> +CFLAGS-.op = -pg $(pie-default)
>  libtype.op = lib%_p.a
>  endif
>
> diff --git a/config.h.in b/config.h.in
> index 014fb4ea0e..26ed7865ef 100644
> --- a/config.h.in
> +++ b/config.h.in
> @@ -236,6 +236,9 @@
>  /* Build glibc with tunables support.  */
>  #define HAVE_TUNABLES 0
>
> +/* Define if static PIE is enabled.  */
> +#define ENABLE_STATIC_PIE 0
> +
>  /* Some compiler options may now allow to use ebp in __asm__ (used mainly
>     in i386 6 argument syscall issue).  */
>  #define CAN_USE_REGISTER_ASM_EBP 0
> diff --git a/configure b/configure
> index 5cb5210107..a04c59bacd 100755
> --- a/configure
> +++ b/configure
> @@ -767,6 +767,7 @@ with_default_link
>  enable_sanity_checks
>  enable_shared
>  enable_profile
> +enable_static_pie
>  enable_timezone_tools
>  enable_hardcoded_path_in_tests
>  enable_stackguard_randomization
> @@ -1424,6 +1425,7 @@ Optional Features:
>                            in special situations) [default=yes]
>    --enable-shared         build shared library [default=yes if GNU ld]
>    --enable-profile        build profiled library [default=no]
> +  --enable-static-pie     build static executables as PIE [default=no]
>    --disable-timezone-tools
>                            do not install timezone tools [default=install]
>    --enable-hardcoded-path-in-tests
> @@ -3372,6 +3374,13 @@ else
>    profile=no
>  fi
>
> +# Check whether --enable-static-pie was given.
> +if test "${enable_static_pie+set}" = set; then :
> +  enableval=$enable_static_pie; static_pie=$enableval
> +else
> +  static_pie=no
> +fi
> +
>  # Check whether --enable-timezone-tools was given.
>  if test "${enable_timezone_tools+set}" = set; then :
>    enableval=$enable_timezone_tools; enable_timezone_tools=$enableval
> @@ -5994,6 +6003,62 @@ fi
>  $as_echo "$libc_linker_feature" >&6; }
>
>
> +{ $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
> +if test x"$gnu_ld" = x"yes"; then
> +  libc_linker_check=`$LD -v --help 2>/dev/null | grep "\--no-dynamic-linker"`
> +  if test -n "$libc_linker_check"; then
> +    cat > conftest.c <<EOF
> +int _start (void) { return 42; }
> +EOF
> +    if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
> +                               -Wl,--no-dynamic-linker -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
> +      libc_linker_feature=yes
> +    fi
> +    rm -f conftest*
> +  fi
> +fi
> +if test $libc_linker_feature = yes; then
> +  libc_cv_no_dynamic_linker=yes
> +else
> +  libc_cv_no_dynamic_linker=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-no-dynamic-linker = $libc_cv_no_dynamic_linker"
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -static-pie" >&5
> +$as_echo_n "checking for -static-pie... " >&6; }
> +if ${libc_cv_static_pie+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  if { ac_try='${CC-cc} -static-pie -xc /dev/null -S -o /dev/null'
> +  { { 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 :
> +  libc_cv_static_pie=yes
> +else
> +  libc_cv_static_pie=no
> +fi
> +
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_static_pie" >&5
> +$as_echo "$libc_cv_static_pie" >&6; }
> +config_vars="$config_vars
> +have-static-pie = $libc_cv_static_pie"
> +
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fpie" >&5
>  $as_echo_n "checking for -fpie... " >&6; }
>  if ${libc_cv_fpie+:} false; then :
> @@ -6888,6 +6953,19 @@ fi
>  $as_echo "$libc_cv_pie_default" >&6; }
>
>
> +if test "$static_pie" = yes; then
> +  # The linker must support --no-dynamic-linker.
> +  if test "$libc_cv_no_dynamic_linker" != yes; then
> +    as_fn_error $? "linker support for --no-dynamic-linker needed" "$LINENO" 5
> +  fi
> +  # Default to PIE.
> +  libc_cv_pie_default=yes
> +  $as_echo "#define ENABLE_STATIC_PIE 1" >>confdefs.h
> +
> +fi
> +config_vars="$config_vars
> +enable-static-pie = $static_pie"
> +
>
>
>
> diff --git a/configure.ac b/configure.ac
> index 2c6308883c..96af835ce8 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -176,6 +176,11 @@ AC_ARG_ENABLE([profile],
>                              [build profiled library @<:@default=no@:>@]),
>               [profile=$enableval],
>               [profile=no])
> +AC_ARG_ENABLE([static-pie],
> +             AC_HELP_STRING([--enable-static-pie],
> +                            [build static executables as PIE @<:@default=no@:>@]),
> +             [static_pie=$enableval],
> +             [static_pie=no])
>  AC_ARG_ENABLE([timezone-tools],
>               AC_HELP_STRING([--disable-timezone-tools],
>                              [do not install timezone tools @<:@default=install@:>@]),
> @@ -1460,6 +1465,19 @@ LIBC_LINKER_FEATURE([-z execstack], [-Wl,-z,execstack],
>                     [libc_cv_z_execstack=yes], [libc_cv_z_execstack=no])
>  AC_SUBST(libc_cv_z_execstack)
>
> +LIBC_LINKER_FEATURE([--no-dynamic-linker],
> +                   [-Wl,--no-dynamic-linker],
> +                   [libc_cv_no_dynamic_linker=yes],
> +                   [libc_cv_no_dynamic_linker=no])
> +LIBC_CONFIG_VAR([have-no-dynamic-linker], [$libc_cv_no_dynamic_linker])
> +
> +AC_CACHE_CHECK(for -static-pie, libc_cv_static_pie, [dnl
> +LIBC_TRY_CC_OPTION([-static-pie],
> +                  [libc_cv_static_pie=yes],
> +                  [libc_cv_static_pie=no])
> +])
> +LIBC_CONFIG_VAR([have-static-pie], [$libc_cv_static_pie])
> +
>  AC_CACHE_CHECK(for -fpie, libc_cv_fpie, [dnl
>  LIBC_TRY_CC_OPTION([-fpie], [libc_cv_fpie=yes], [libc_cv_fpie=no])
>  ])
> @@ -1962,6 +1980,17 @@ fi
>  rm -f conftest.*])
>  AC_SUBST(libc_cv_pie_default)
>
> +if test "$static_pie" = yes; then
> +  # The linker must support --no-dynamic-linker.
> +  if test "$libc_cv_no_dynamic_linker" != yes; then
> +    AC_MSG_ERROR([linker support for --no-dynamic-linker needed])
> +  fi
> +  # Default to PIE.
> +  libc_cv_pie_default=yes
> +  AC_DEFINE(ENABLE_STATIC_PIE)
> +fi
> +LIBC_CONFIG_VAR([enable-static-pie], [$static_pie])
> +
>  AC_SUBST(profile)
>  AC_SUBST(static_nss)
>
> diff --git a/csu/libc-start.c b/csu/libc-start.c
> index 24c63be02f..34dd125260 100644
> --- a/csu/libc-start.c
> +++ b/csu/libc-start.c
> @@ -141,6 +141,8 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
>    __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up;
>
>  #ifndef SHARED
> +  _dl_relocate_static_pie ();
> +
>    char **ev = &argv[argc + 1];
>
>    __environ = ev;
> diff --git a/csu/libc-tls.c b/csu/libc-tls.c
> index 00138eb43a..1f8ddaf543 100644
> --- a/csu/libc-tls.c
> +++ b/csu/libc-tls.c
> @@ -114,6 +114,8 @@ __libc_setup_tls (void)
>    size_t tcb_offset;
>    const ElfW(Phdr) *phdr;
>
> +  struct link_map *main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
> +
>    /* Look through the TLS segment if there is any.  */
>    if (_dl_phdr != NULL)
>      for (phdr = _dl_phdr; phdr < &_dl_phdr[_dl_phnum]; ++phdr)
> @@ -122,7 +124,7 @@ __libc_setup_tls (void)
>           /* Remember the values we need.  */
>           memsz = phdr->p_memsz;
>           filesz = phdr->p_filesz;
> -         initimage = (void *) phdr->p_vaddr;
> +         initimage = (void *) phdr->p_vaddr + main_map->l_addr;
>           align = phdr->p_align;
>           if (phdr->p_align > max_align)
>             max_align = phdr->p_align;
> @@ -163,8 +165,6 @@ __libc_setup_tls (void)
>    _dl_static_dtv[0].counter = (sizeof (_dl_static_dtv) / sizeof (_dl_static_dtv[0])) - 2;
>    // _dl_static_dtv[1].counter = 0;            would be needed if not already done
>
> -  struct link_map *main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
> -
>    /* Initialize the TLS block.  */
>  #if TLS_TCB_AT_TP
>    _dl_static_dtv[2].pointer.val = ((char *) tlsblock + tcb_offset
> diff --git a/elf/dl-support.c b/elf/dl-support.c
> index 48340f7959..09b2229d48 100644
> --- a/elf/dl-support.c
> +++ b/elf/dl-support.c
> @@ -26,7 +26,11 @@
>  #include <sys/param.h>
>  #include <stdint.h>
>  #include <ldsodefs.h>
> -#include <dl-machine.h>
> +#if ENABLE_STATIC_PIE
> +# include "dynamic-link.h"
> +#else
> +# include <dl-machine.h>
> +#endif
>  #include <libc-lock.h>
>  #include <dl-cache.h>
>  #include <dl-librecon.h>
> @@ -199,7 +203,9 @@ const ElfW(Ehdr) *_dl_sysinfo_dso;
>
>  struct link_map *_dl_sysinfo_map;
>
> -# include "get-dynamic-info.h"
> +# if !ENABLE_STATIC_PIE
> +#  include "get-dynamic-info.h"
> +# endif
>  #endif
>  #include "setup-vdso.h"
>
> @@ -303,6 +309,35 @@ _dl_aux_init (ElfW(auxv_t) *av)
>  }
>  #endif
>
> +#if ENABLE_STATIC_PIE
> +/* Relocate static executable with PIE.  */
> +
> +void
> +_dl_relocate_static_pie (void)
> +{
> +# define STATIC_PIE_BOOTSTRAP
> +# define RESOLVE_MAP(sym, version, flags) (&_dl_main_map)
> +# include "dynamic-link.h"
> +
> +  /* Figure out the run-time load addres of static PIE.  */
> +  _dl_main_map.l_addr = elf_machine_load_address ();
> +
> +  /* Read our own dynamic section and fill in the info array.  */
> +  _dl_main_map.l_ld = ((void *) _dl_main_map.l_addr
> +                      + elf_machine_dynamic ());
> +  elf_get_dynamic_info (&_dl_main_map, NULL);
> +
> +# ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
> +  ELF_MACHINE_BEFORE_RTLD_RELOC (_dl_main_map.l_info);
> +# endif
> +
> +  /* Relocate ourselves so we can do normal function calls and
> +     data access using the global offset table.  */
> +  ELF_DYNAMIC_RELOCATE (&_dl_main_map, 0, 0, 0);
> +  _dl_main_map.l_relocated = 1;
> +}
> +#endif
> +
>
>  void
>  internal_function
> diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
> index 60f2d91151..d3935f7da7 100644
> --- a/elf/dynamic-link.h
> +++ b/elf/dynamic-link.h
> @@ -95,7 +95,7 @@ elf_machine_lazy_rel (struct link_map *map,
>
>  #ifdef RESOLVE_MAP
>
> -# ifdef RTLD_BOOTSTRAP
> +# if defined RTLD_BOOTSTRAP || defined STATIC_PIE_BOOTSTRAP
>  #  define ELF_DURING_STARTUP (1)
>  # else
>  #  define ELF_DURING_STARTUP (0)
> diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h
> index 7525c3a5b2..eb26d23649 100644
> --- a/elf/get-dynamic-info.h
> +++ b/elf/get-dynamic-info.h
> @@ -38,7 +38,7 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
>    typedef Elf64_Xword d_tag_utype;
>  #endif
>
> -#ifndef RTLD_BOOTSTRAP
> +#if !defined RTLD_BOOTSTRAP && !defined STATIC_PIE_BOOTSTRAP
>    if (dyn == NULL)
>      return;
>  #endif
> @@ -139,9 +139,11 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
>    /* Only the bind now flags are allowed.  */
>    assert (info[VERSYMIDX (DT_FLAGS_1)] == NULL
>           || (info[VERSYMIDX (DT_FLAGS_1)]->d_un.d_val & ~DF_1_NOW) == 0);
> +  /* Flags must not be set for ld.so.  */
>    assert (info[DT_FLAGS] == NULL
>           || (info[DT_FLAGS]->d_un.d_val & ~DF_BIND_NOW) == 0);
> -  /* Flags must not be set for ld.so.  */
> +#endif
> +#if defined RTLD_BOOTSTRAP || defined STATIC_PIE_BOOTSTRAP
>    assert (info[DT_RUNPATH] == NULL);
>    assert (info[DT_RPATH] == NULL);
>  #else
> diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
> index 49e673dd24..83791103cf 100644
> --- a/sysdeps/generic/ldsodefs.h
> +++ b/sysdeps/generic/ldsodefs.h
> @@ -1069,6 +1069,13 @@ extern void _dl_determine_tlsoffset (void) internal_function attribute_hidden;
>     stack protector, among other things).  */
>  void __libc_setup_tls (void);
>
> +# if ENABLE_STATIC_PIE
> +/* Relocate static executable with PIE.  */
> +void _dl_relocate_static_pie (void) attribute_hidden;
> +# else
> +#  define _dl_relocate_static_pie()
> +# endif
> +
>  /* Initialization of libpthread for statically linked applications.
>     If libpthread is not linked in, this is an empty function.  */
>  void __pthread_initialize_minimal (void) weak_function;
> diff --git a/sysdeps/x86_64/configure b/sysdeps/x86_64/configure
> index efef46b1b7..8ee15b8a25 100644
> --- a/sysdeps/x86_64/configure
> +++ b/sysdeps/x86_64/configure
> @@ -85,6 +85,39 @@ if test x"$build_mathvec" = xnotset; then
>    build_mathvec=yes
>  fi
>
> +if test "$static_pie" = yes; then
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker static PIE support" >&5
> +$as_echo_n "checking for linker static PIE support... " >&6; }
> +if ${libc_cv_ld_static_pie+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  cat > conftest.s <<\EOF
> +       .text
> +       .global _start
> +       .weak foo
> +_start:
> +       leaq    foo(%rip), %rax
> +EOF
> +  libc_cv_pie_option="-Wl,-pie"
> +  if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostartfiles -nostdlib $no_ssp $libc_cv_pie_option conftest.s 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
> +    libc_cv_ld_static_pie=yes
> +  else
> +    libc_cv_ld_static_pie=no
> +  fi
> +rm -f conftest*
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_ld_static_pie" >&5
> +$as_echo "$libc_cv_ld_static_pie" >&6; }
> +  if test "$libc_cv_ld_static_pie" != yes; then
> +    as_fn_error $? "linker support for static PIE needed" "$LINENO" 5
> +  fi
> +fi
> +
>  $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
>
>
> diff --git a/sysdeps/x86_64/configure.ac b/sysdeps/x86_64/configure.ac
> index fa86e953ee..c2d7cf3e61 100644
> --- a/sysdeps/x86_64/configure.ac
> +++ b/sysdeps/x86_64/configure.ac
> @@ -44,6 +44,28 @@ if test x"$build_mathvec" = xnotset; then
>    build_mathvec=yes
>  fi
>
> +dnl Check if linker supports static PIE.
> +if test "$static_pie" = yes; then
> +  AC_CACHE_CHECK(for linker static PIE support, libc_cv_ld_static_pie, [dnl
> +cat > conftest.s <<\EOF
> +       .text
> +       .global _start
> +       .weak foo
> +_start:
> +       leaq    foo(%rip), %rax
> +EOF
> +  libc_cv_pie_option="-Wl,-pie"
> +  if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -nostartfiles -nostdlib $no_ssp $libc_cv_pie_option conftest.s 1>&AS_MESSAGE_LOG_FD); then
> +    libc_cv_ld_static_pie=yes
> +  else
> +    libc_cv_ld_static_pie=no
> +  fi
> +rm -f conftest*])
> +  if test "$libc_cv_ld_static_pie" != yes; then
> +    AC_MSG_ERROR([linker support for static PIE needed])
> +  fi
> +fi
> +
>  dnl It is always possible to access static and hidden symbols in an
>  dnl position independent way.
>  AC_DEFINE(PI_STATIC_AND_HIDDEN)
> --
> 2.13.5
>

Any comments?

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]