From patchwork Tue Dec 7 08:26:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddhesh Poyarekar X-Patchwork-Id: 48570 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BFDC43858435 for ; Tue, 7 Dec 2021 08:27:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BFDC43858435 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1638865644; bh=bL7+IrUX26FANmin07Ew5RZBQoL3a8jtG4kt7Xe+Yb8=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=eP0csDC85SJXVXVQXMLHpCoowxjgRRwOgaxD+Lpz5TYN+I0vgYgAC4C5k4DXGLEId SP3ZGn5F12Aep6iYFwjmHMhpXTpnACU1RKlYEmeDG1I/+q7pqiR8kcvOYzcUVi8Uli Z/x80/dVh0/eh81InC+fb3s+crsdK6eeOPsvQAIE= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from dog.elm.relay.mailchannels.net (dog.elm.relay.mailchannels.net [23.83.212.48]) by sourceware.org (Postfix) with ESMTPS id A67193858C60 for ; Tue, 7 Dec 2021 08:26:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A67193858C60 X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 3BF378C185E; Tue, 7 Dec 2021 08:26:58 +0000 (UTC) Received: from pdx1-sub0-mail-a304.dreamhost.com (unknown [127.0.0.6]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id BAAD08C0CD7; Tue, 7 Dec 2021 08:26:57 +0000 (UTC) X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from pdx1-sub0-mail-a304.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.105.57.109 (trex/6.4.3); Tue, 07 Dec 2021 08:26:58 +0000 X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|siddhesh@gotplt.org X-MailChannels-Auth-Id: dreamhost X-Chemical-Name: 4027d61b41377e02_1638865618040_4056473990 X-MC-Loop-Signature: 1638865618040:189737868 X-MC-Ingress-Time: 1638865618040 Received: from rhbox.redhat.com (unknown [223.185.2.127]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: siddhesh@gotplt.org) by pdx1-sub0-mail-a304.dreamhost.com (Postfix) with ESMTPSA id 4J7YLQ3Rxgz29; Tue, 7 Dec 2021 00:26:54 -0800 (PST) To: libc-alpha@sourceware.org Subject: [PATCH] Replace --enable-static-pie with --disable-default-pie Date: Tue, 7 Dec 2021 13:56:38 +0530 Message-Id: <20211207082638.1960585-1-siddhesh@sourceware.org> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-Spam-Status: No, score=-1168.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_NONE, KAM_DMARC_STATUS, RCVD_IN_BL_SPAMCOP_NET, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NEUTRAL, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Siddhesh Poyarekar via Libc-alpha From: Siddhesh Poyarekar Reply-To: Siddhesh Poyarekar Cc: fweimer@redhat.com Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Build glibc programs and tests as PIE by default and enable static-pie automatically if the architecture and toolchain supports it. Also add a new configuration option --disable-default-pie to prevent building programs as PIE. Only the following architectures now have PIE disabled by default because they do not work at the moment. hppa, ia64 and csky don't work because the linker is unable to handle a pcrel relocation generated from PIE objects. The microblaze compiler is currently failing with an ICE. GNU hurd tries to enable static-pie, which does not work and hence fails. It could be made to work, but I've left the enabling for the Hurd maintainer. build-many-glibcs runs clean for all targets now; following are the failures before disabling PIE for these targets. I also tested x86_64 on Fedora and Ubuntu, to verify that the default build as well as --disable-default-pie work as expected with both system toolchains. FAIL: glibcs-microblazeel-linux-gnu check ICE FAIL: glibcs-csky-linux-gnuabiv2-soft check build-many-2/build/glibcs/csky-linux-gnuabiv2-soft/glibc/math/test-tgmath2.o: in function `main': build-many-2/src/glibc/math/../support/test-driver.c:124:(.text.startup+0x24): relocation truncated to fit: R_CKCORE_PCREL_IMM18BY2 against `.text' FAIL: glibcs-csky-linux-gnuabiv2 check /tmp/ccaEAi1b.s: Assembler messages: /tmp/ccaEAi1b.s:409254: Error: pcrel offset for branch to too far (0xfffffffffffc44a1) make[3]: *** [../o-iterator.mk:9: build-many-2/build/glibcs/csky-linux-gnuabiv2/glibc/math/test-tgmath3-fma.o] Error 1 FAIL: glibcs-ia64-linux-gnu build build-many-2/build/glibcs/ia64-linux-gnu/glibc/libc.a(dl-support.o): in function `_dl_aux_init': build-many-2/src/glibc/elf/dl-support.c:254:(.text+0x42): relocation truncated to fit: GPREL22 against `.text' build-many-2/build/glibcs/ia64-linux-gnu/glibc/libc.a(dl-support.o): in function `setup_vdso': build-many-2/src/glibc/elf/setup-vdso.h:108:(.text+0x1092): relocation truncated to fit: GPREL22 against `.text' FAIL: glibcs-microblaze-linux-gnu check ICE FAIL: glibcs-hppa-linux-gnu check build-many-2/install/compilers/hppa-linux-gnu/lib/gcc/hppa-glibc-linux-gnu/11.2.1/../../../../hppa-glibc-linux-gnu/bin/ld: build-many-2/build/glibcs/hppa-linux-gnu/glibc/nptl/tst-audit-threads.o(.text+0x22a58): cannot reach 0000004f_retNum6056+0, recompile with -ffunction-sections build-many-2/install/compilers/hppa-linux-gnu/lib/gcc/hppa-glibc-linux-gnu/11.2.1/../../../../hppa-glibc-linux-gnu/bin/ld: build-many-2/build/glibcs/hppa-linux-gnu/glibc/nptl/tst-audit-threads.o(.text+0x22a58): cannot handle R_PARISC_PCREL17F for retNum6056 build-many-2/install/compilers/hppa-linux-gnu/lib/gcc/hppa-glibc-linux-gnu/11.2.1/../../../../hppa-glibc-linux-gnu/bin/ld: final link failed: bad value FAIL: glibcs-i686-gnu build build-many-2/install/compilers/i686-gnu/lib/gcc/i686-glibc-gnu/11.2.1/../../../../i686-glibc-gnu/bin/ld: cannot find build-many-2/build/glibcs/i686-gnu/glibc/csu/rcrt0.o: No such file or directory collect2: error: ld returned 1 exit status make[3]: *** [../Rules:269: build-many-2/build/glibcs/i686-gnu/glibc/support/test-run-command] Error 1 Signed-off-by: Siddhesh Poyarekar --- INSTALL | 19 ++++---- Makeconfig | 21 ++++++--- NEWS | 12 +++++ config.h.in | 3 ++ config.make.in | 3 -- configure | 83 +++++++++++++++++++++------------ configure.ac | 56 ++++++++++++---------- manual/install.texi | 17 ++++--- scripts/build-many-glibcs.py | 12 ++--- sysdeps/csky/configure | 6 +++ sysdeps/csky/configure.ac | 4 ++ sysdeps/hppa/configure | 6 +++ sysdeps/hppa/configure.ac | 4 ++ sysdeps/ia64/configure | 4 ++ sysdeps/ia64/configure.ac | 3 ++ sysdeps/mach/hurd/configure | 5 ++ sysdeps/mach/hurd/configure.ac | 4 ++ sysdeps/microblaze/configure | 7 +++ sysdeps/microblaze/configure.ac | 6 +++ sysdeps/sparc/Makefile | 1 + 20 files changed, 186 insertions(+), 90 deletions(-) create mode 100755 sysdeps/microblaze/configure create mode 100644 sysdeps/microblaze/configure.ac diff --git a/INSTALL b/INSTALL index 02dcf6b1ca..56d2a31dad 100644 --- a/INSTALL +++ b/INSTALL @@ -111,16 +111,15 @@ if 'CFLAGS' is specified it must enable optimization. For example: systems support shared libraries; you need ELF support and (currently) the GNU linker. -'--enable-static-pie' - Enable static position independent executable (static PIE) support. - Static PIE is similar to static executable, but can be loaded at - any address without help from a dynamic linker. All static - programs as well as static tests are built as static PIE, except - for those marked with no-pie. The resulting glibc can be used with - the GCC option, -static-pie, which is available with GCC 8 or - above, to create static PIE. This option also implies that glibc - programs and tests are created as dynamic position independent - executables (PIE) by default. +'--disable-default-pie' + Don't build glibc programs and tests in the testsuite as position + independent executables (PIE). By default, glibc programs and tests + are created as position independent executables. If the toolchain + and architecture supports it, static executable are built as static + PIE and the resulting glibc can be used with the GCC option, + -static-pie, which is available with GCC 8 or above, to create + static PIE. PIE is not enabled by default on i686 GNU/Hurd, HPPA, + IA64, CSKY and Microblaze targets. '--enable-cet' '--enable-cet=permissive' diff --git a/Makeconfig b/Makeconfig index 3fa2f13003..775bf12b65 100644 --- a/Makeconfig +++ b/Makeconfig @@ -1,4 +1,5 @@ # Copyright (C) 1991-2021 Free Software Foundation, Inc. +# Copyright (C) The GNU Toolchain Authors. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -376,19 +377,24 @@ LDFLAGS.so += $(hashstyle-LDFLAGS) LDFLAGS-rtld += $(hashstyle-LDFLAGS) endif -ifeq (yes,$(enable-static-pie)) +ifeq (no,$(build-pie-default)) +pie-default = $(no-pie-ccflag) +else # build-pie-default pic-default = -DPIC # Compile libc.a and libc_p.a with -fPIE/-fpie for static PIE. pie-default = $(pie-ccflag) + +ifeq (yes,$(enable-static-pie)) ifeq (yes,$(have-static-pie)) -default-pie-ldflag = -static-pie +static-pie-ldflag = -static-pie else # Static PIE can't have dynamic relocations in read-only segments since # static PIE is mapped into memory by kernel. --eh-frame-hdr is needed # for PIE to support exception. -default-pie-ldflag = -Wl,-pie,--no-dynamic-linker,--eh-frame-hdr,-z,text -endif -endif +static-pie-ldflag = -Wl,-pie,--no-dynamic-linker,--eh-frame-hdr,-z,text +endif # have-static-pie +endif # enable-static-pie +endif # build-pie-default # If lazy relocations are disabled, add the -z now flag. Use # LDFLAGS-lib.so instead of LDFLAGS.so, to avoid adding the flag to @@ -444,7 +450,7 @@ endif # Command for statically linking programs with the C library. ifndef +link-static +link-static-before-inputs = -nostdlib -nostartfiles -static \ - $(if $($(@F)-no-pie),$(no-pie-ldflag),$(default-pie-ldflag)) \ + $(if $($(@F)-no-pie),$(no-pie-ldflag),$(static-pie-ldflag)) \ $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \ $(firstword $(CRT-$(@F)) $(csu-objpfx)$(real-static-start-installed-name)) \ $(+preinit) $(+prectorT) @@ -479,7 +485,7 @@ ifeq (yes,$(build-pie-default)) +link-tests-after-inputs = $(link-libc-tests) $(+link-pie-after-libc) +link-printers-tests = $(+link-pie-printers-tests) else # not build-pie-default -+link-before-inputs = -nostdlib -nostartfiles \ ++link-before-inputs = -nostdlib -nostartfiles $(no-pie-ldflag) \ $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \ $(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \ $(firstword $(CRT-$(@F)) $(csu-objpfx)$(start-installed-name)) \ @@ -1040,6 +1046,7 @@ PIC-ccflag = -fPIC endif # This can be changed by a sysdep makefile pie-ccflag = -fpie +no-pie-ccflag = -fno-pie # This one should always stay like this unless there is a very good reason. PIE-ccflag = -fPIE ifeq (yes,$(build-profile)) diff --git a/NEWS b/NEWS index f10971b180..f12f3ffde4 100644 --- a/NEWS +++ b/NEWS @@ -68,6 +68,14 @@ Major new features: to be used by compilers for optimizing usage of 'memcmp' when its return value is only used for its boolean status. +* All programs and tests in glibc are now built as position independent + executables (PIE) by default on architectures that support it. Further, if + static-pie is available in the toolchain and the architecture, it is also + enabled and static programs also built as executable. A new option + --disable-default-pie has been added to disable this behavior and get a + non-PIE build. Default PIE is not supported on GNU Hurd, HPPA, IA64, CSKY + and Microblaze targets. + Deprecated and removed features, and other changes affecting compatibility: * The r_version update in the debugger interface makes the glibc binary @@ -80,6 +88,10 @@ Deprecated and removed features, and other changes affecting compatibility: * Intel MPX support (lazy PLT, ld.so profile, and LD_AUDIT) has been removed. +* The --enable-static-pie option is no longer available. The glibc build + configuration script now automatically detects static-pie support in the + toolchain and architecture and enables it if available. + Changes to build and runtime requirements: [Add changes to build and runtime requirements here] diff --git a/config.h.in b/config.h.in index 0a6f57b006..acce608373 100644 --- a/config.h.in +++ b/config.h.in @@ -265,6 +265,9 @@ /* Build glibc with tunables support. */ #define HAVE_TUNABLES 0 +/* Define if PIE is unsupported. */ +#undef PIE_UNSUPPORTED + /* Define if static PIE is supported. */ #undef SUPPORT_STATIC_PIE diff --git a/config.make.in b/config.make.in index cbf59114b0..e8630a8d0c 100644 --- a/config.make.in +++ b/config.make.in @@ -90,9 +90,6 @@ static-nss-crypt = @libc_cv_static_nss_crypt@ # Configuration options. build-shared = @shared@ -build-pic-default= @libc_cv_pic_default@ -build-pie-default= @libc_cv_pie_default@ -cc-pie-default= @libc_cv_cc_pie_default@ build-profile = @profile@ build-static-nss = @static_nss@ cross-compiling = @cross_compiling@ diff --git a/configure b/configure index 2f9adca064..4dce154938 100755 --- a/configure +++ b/configure @@ -596,9 +596,6 @@ DEFINES static_nss profile libc_cv_multidir -libc_cv_pie_default -libc_cv_cc_pie_default -libc_cv_pic_default shared static ldd_rewrite_script @@ -767,7 +764,7 @@ with_nonshared_cflags enable_sanity_checks enable_shared enable_profile -enable_static_pie +enable_default_pie enable_timezone_tools enable_hardcoded_path_in_tests enable_hidden_plt @@ -1423,8 +1420,8 @@ 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 enable static PIE support and use it in the - testsuite [default=no] + --disable-default-pie Do not build glibc programs and tests in the + testsuite as PIE [default=no] --disable-timezone-tools do not install timezone tools [default=install] --enable-hardcoded-path-in-tests @@ -3408,11 +3405,11 @@ 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 +# Check whether --enable-default-pie was given. +if test "${enable_default_pie+set}" = set; then : + enableval=$enable_default_pie; default_pie=$enableval else - static_pie=no + default_pie=yes fi # Check whether --enable-timezone-tools was given. @@ -6959,7 +6956,8 @@ rm -f conftest.* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_pic_default" >&5 $as_echo "$libc_cv_pic_default" >&6; } - +config_vars="$config_vars +build-pic-default = $libc_cv_pic_default" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -fPIE is default" >&5 $as_echo_n "checking whether -fPIE is default... " >&6; } @@ -6979,17 +6977,37 @@ rm -f conftest.* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_pie_default" >&5 $as_echo "$libc_cv_cc_pie_default" >&6; } -libc_cv_pie_default=$libc_cv_cc_pie_default - - - -# Set the `multidir' variable by grabbing the variable from the compiler. -# We do it once and save the result in a generated makefile. -libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` - +config_vars="$config_vars +cc-pie-default = $libc_cv_cc_pie_default" -if test "$static_pie" = yes; then - # Check target support for static PIE +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can build programs as PIE" >&5 +$as_echo_n "checking if we can build programs as PIE... " >&6; } +if test "x$default_pie" != xno; then + # Disable build-pie-default if target does not support it. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef PIE_UNSUPPORTED +# error PIE is not supported +#endif +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + libc_cv_pie_default=yes +else + libc_cv_pie_default=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_pie_default" >&5 +$as_echo "$libc_cv_pie_default" >&6; } +config_vars="$config_vars +build-pie-default = $libc_cv_pie_default" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can build static PIE programs" >&5 +$as_echo_n "checking if we can build static PIE programs... " >&6; } +libc_cv_static_pie=$libc_cv_pie_default +if test "x$libc_cv_pie_default" != xno \ + -a "$libc_cv_no_dynamic_linker" = yes; then + # Enable static-pie if available cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef SUPPORT_STATIC_PIE @@ -6997,22 +7015,25 @@ if test "$static_pie" = yes; then #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - + libc_cv_static_pie=yes else - as_fn_error $? "the architecture does not support static PIE" "$LINENO" 5 + libc_cv_static_pie=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - # 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 + if test "$libc_cv_static_pie" = "yes"; then + $as_echo "#define ENABLE_STATIC_PIE 1" >>confdefs.h + 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 -enable-static-pie = $static_pie" +enable-static-pie = $libc_cv_static_pie" + +# Set the `multidir' variable by grabbing the variable from the compiler. +# We do it once and save the result in a generated makefile. +libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` + diff --git a/configure.ac b/configure.ac index 7eb4239359..55d3162a4d 100644 --- a/configure.ac +++ b/configure.ac @@ -179,11 +179,11 @@ AC_ARG_ENABLE([profile], [build profiled library @<:@default=no@:>@]), [profile=$enableval], [profile=no]) -AC_ARG_ENABLE([static-pie], - AS_HELP_STRING([--enable-static-pie], - [enable static PIE support and use it in the testsuite @<:@default=no@:>@]), - [static_pie=$enableval], - [static_pie=no]) +AC_ARG_ENABLE([default-pie], + AS_HELP_STRING([--disable-default-pie], + [Do not build glibc programs and tests in the testsuite as PIE @<:@default=no@:>@]), + [default_pie=$enableval], + [default_pie=yes]) AC_ARG_ENABLE([timezone-tools], AS_HELP_STRING([--disable-timezone-tools], [do not install timezone tools @<:@default=install@:>@]), @@ -1839,7 +1839,7 @@ if eval "${CC-cc} -S conftest.c 2>&AS_MESSAGE_LOG_FD 1>&AS_MESSAGE_LOG_FD"; then libc_cv_pic_default=no fi rm -f conftest.*]) -AC_SUBST(libc_cv_pic_default) +LIBC_CONFIG_VAR([build-pic-default], [$libc_cv_pic_default]) AC_CACHE_CHECK([whether -fPIE is default], libc_cv_cc_pie_default, [libc_cv_cc_pie_default=yes @@ -1852,30 +1852,38 @@ if eval "${CC-cc} -S conftest.c 2>&AS_MESSAGE_LOG_FD 1>&AS_MESSAGE_LOG_FD"; then libc_cv_cc_pie_default=no fi rm -f conftest.*]) -libc_cv_pie_default=$libc_cv_cc_pie_default -AC_SUBST(libc_cv_cc_pie_default) -AC_SUBST(libc_cv_pie_default) +LIBC_CONFIG_VAR([cc-pie-default], [$libc_cv_cc_pie_default]) + +AC_MSG_CHECKING(if we can build programs as PIE) +if test "x$default_pie" != xno; then + # Disable build-pie-default if target does not support it. + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#ifdef PIE_UNSUPPORTED +# error PIE is not supported +#endif]])], [libc_cv_pie_default=yes], [libc_cv_pie_default=no]) +fi +AC_MSG_RESULT($libc_cv_pie_default) +LIBC_CONFIG_VAR([build-pie-default], [$libc_cv_pie_default]) + +AC_MSG_CHECKING(if we can build static PIE programs) +libc_cv_static_pie=$libc_cv_pie_default +if test "x$libc_cv_pie_default" != xno \ + -a "$libc_cv_no_dynamic_linker" = yes; then + # Enable static-pie if available + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#ifndef SUPPORT_STATIC_PIE +# error static PIE is not supported +#endif]])], [libc_cv_static_pie=yes], [libc_cv_static_pie=no]) + if test "$libc_cv_static_pie" = "yes"; then + AC_DEFINE(ENABLE_STATIC_PIE) + fi +fi +AC_MSG_RESULT($libc_cv_static_pie) +LIBC_CONFIG_VAR([enable-static-pie], [$libc_cv_static_pie]) # Set the `multidir' variable by grabbing the variable from the compiler. # We do it once and save the result in a generated makefile. libc_cv_multidir=`${CC-cc} $CFLAGS $CPPFLAGS -print-multi-directory` AC_SUBST(libc_cv_multidir) -if test "$static_pie" = yes; then - # Check target support for static PIE - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#ifndef SUPPORT_STATIC_PIE -# error static PIE is not supported -#endif]])], , AC_MSG_ERROR([the architecture does not support static PIE])) - # 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/manual/install.texi b/manual/install.texi index 46f73b538d..dff20fefa1 100644 --- a/manual/install.texi +++ b/manual/install.texi @@ -141,15 +141,14 @@ Don't build shared libraries even if it is possible. Not all systems support shared libraries; you need ELF support and (currently) the GNU linker. -@item --enable-static-pie -Enable static position independent executable (static PIE) support. -Static PIE is similar to static executable, but can be loaded at any -address without help from a dynamic linker. All static programs as -well as static tests are built as static PIE, except for those marked -with no-pie. The resulting glibc can be used with the GCC option, --static-pie, which is available with GCC 8 or above, to create static -PIE. This option also implies that glibc programs and tests are created -as dynamic position independent executables (PIE) by default. +@item --disable-default-pie +Don't build glibc programs and tests in the testsuite as position independent +executables (PIE). By default, glibc programs and tests are created as +position independent executables. If the toolchain and architecture supports +it, static executable are built as static PIE and the resulting glibc can be +used with the GCC option, -static-pie, which is available with GCC 8 or above, +to create static PIE. PIE is not enabled by default on i686 GNU/Hurd, HPPA, +IA64, CSKY and Microblaze targets. @item --enable-cet @itemx --enable-cet=permissive diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py index 6ae2172956..89bd06881f 100755 --- a/scripts/build-many-glibcs.py +++ b/scripts/build-many-glibcs.py @@ -437,15 +437,15 @@ class Context(object): '--disable-experimental-malloc', '--disable-build-nscd', '--disable-nscd']}, - {'variant': 'static-pie', - 'cfg': ['--enable-static-pie']}, - {'variant': 'x32-static-pie', + {'variant': 'no-pie', + 'cfg': ['--disable-default-pie']}, + {'variant': 'x32-no-pie', 'ccopts': '-mx32', - 'cfg': ['--enable-static-pie']}, - {'variant': 'static-pie', + 'cfg': ['--disable-default-pie']}, + {'variant': 'no-pie', 'arch': 'i686', 'ccopts': '-m32 -march=i686', - 'cfg': ['--enable-static-pie']}, + 'cfg': ['--disable-default-pie']}, {'variant': 'disable-multi-arch', 'arch': 'i686', 'ccopts': '-m32 -march=i686', diff --git a/sysdeps/csky/configure b/sysdeps/csky/configure index 19acb084fb..08caa633b1 100644 --- a/sysdeps/csky/configure +++ b/sysdeps/csky/configure @@ -2,3 +2,9 @@ # Local configure fragment for sysdeps/csky. $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h + + +# PIE builds don't work. +$as_echo "#define PIE_UNSUPPORTED 1" >>confdefs.h + +# work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/csky/configure.ac b/sysdeps/csky/configure.ac index 5656b665da..9613c68338 100644 --- a/sysdeps/csky/configure.ac +++ b/sysdeps/csky/configure.ac @@ -2,3 +2,7 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. # Local configure fragment for sysdeps/csky. AC_DEFINE(PI_STATIC_AND_HIDDEN) + +# PIE builds don't work. +AC_DEFINE(PIE_UNSUPPORTED) +# work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/hppa/configure b/sysdeps/hppa/configure index 2cfe6cbea1..1a0530ef9f 100644 --- a/sysdeps/hppa/configure +++ b/sysdeps/hppa/configure @@ -30,3 +30,9 @@ $as_echo "$libc_cv_asm_line_sep" >&6; } cat >>confdefs.h <<_ACEOF #define ASM_LINE_SEP $libc_cv_asm_line_sep _ACEOF + + +# PIE builds don't work. +$as_echo "#define PIE_UNSUPPORTED 1" >>confdefs.h + +# work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/hppa/configure.ac b/sysdeps/hppa/configure.ac index 1ec417b947..3aa5cde7ce 100644 --- a/sysdeps/hppa/configure.ac +++ b/sysdeps/hppa/configure.ac @@ -19,3 +19,7 @@ else fi rm -f conftest*]) AC_DEFINE_UNQUOTED(ASM_LINE_SEP, $libc_cv_asm_line_sep) + +# PIE builds don't work. +AC_DEFINE(PIE_UNSUPPORTED) +# work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/ia64/configure b/sysdeps/ia64/configure index 1ef70921bc..c13b11d5af 100644 --- a/sysdeps/ia64/configure +++ b/sysdeps/ia64/configure @@ -3,4 +3,8 @@ $as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h + +# PIE builds don't work. +$as_echo "#define PIE_UNSUPPORTED 1" >>confdefs.h + # work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/ia64/configure.ac b/sysdeps/ia64/configure.ac index 3bae9fc5e1..8f16c49d4d 100644 --- a/sysdeps/ia64/configure.ac +++ b/sysdeps/ia64/configure.ac @@ -4,4 +4,7 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. dnl It is always possible to access static and hidden symbols in an dnl position independent way. AC_DEFINE(PI_STATIC_AND_HIDDEN) + +# PIE builds don't work. +AC_DEFINE(PIE_UNSUPPORTED) # work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/mach/hurd/configure b/sysdeps/mach/hurd/configure index 8d0702ad43..1192a5261d 100644 --- a/sysdeps/mach/hurd/configure +++ b/sysdeps/mach/hurd/configure @@ -49,3 +49,8 @@ fi # Hurd has libpthread as a separate library. pthread_in_libc=no + +# PIE builds don't work. +$as_echo "#define PIE_UNSUPPORTED 1" >>confdefs.h + +# work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/mach/hurd/configure.ac b/sysdeps/mach/hurd/configure.ac index 82d085af33..115d809cec 100644 --- a/sysdeps/mach/hurd/configure.ac +++ b/sysdeps/mach/hurd/configure.ac @@ -29,3 +29,7 @@ fi # Hurd has libpthread as a separate library. pthread_in_libc=no + +# PIE builds don't work. +AC_DEFINE(PIE_UNSUPPORTED) +# work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/microblaze/configure b/sysdeps/microblaze/configure new file mode 100755 index 0000000000..2805a4568d --- /dev/null +++ b/sysdeps/microblaze/configure @@ -0,0 +1,7 @@ +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! + # Local configure fragment for sysdeps/microblaze. + +# PIE builds don't work. +$as_echo "#define PIE_UNSUPPORTED 1" >>confdefs.h + +# work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/microblaze/configure.ac b/sysdeps/microblaze/configure.ac new file mode 100644 index 0000000000..3dce7167db --- /dev/null +++ b/sysdeps/microblaze/configure.ac @@ -0,0 +1,6 @@ +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/microblaze. + +# PIE builds don't work. +AC_DEFINE(PIE_UNSUPPORTED) +# work around problem with autoconf and empty lines at the end of files diff --git a/sysdeps/sparc/Makefile b/sysdeps/sparc/Makefile index 1be9a3db2c..12c2c1b085 100644 --- a/sysdeps/sparc/Makefile +++ b/sysdeps/sparc/Makefile @@ -2,6 +2,7 @@ long-double-fcts = yes pie-ccflag = -fPIE +no-pie-ccflag = -fno-PIE ifeq ($(subdir),gmon) sysdep_routines += sparc-mcount