From patchwork Thu Aug 19 18:48:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iain Sandoe X-Patchwork-Id: 1518802 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (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) by ozlabs.org (Postfix) with ESMTPS id 4GrDLv0SSfz9sW5 for ; Fri, 20 Aug 2021 04:48:54 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4ED1E39B90B8 for ; Thu, 19 Aug 2021 18:48:52 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp001-out.apm-internet.net (smtp001-out.apm-internet.net [85.119.248.222]) by sourceware.org (Postfix) with ESMTPS id 9970A385482F for ; Thu, 19 Aug 2021 18:48:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9970A385482F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sandoe.co.uk Authentication-Results: sourceware.org; spf=none smtp.mailfrom=sandoe.co.uk Received: (qmail 93027 invoked from network); 19 Aug 2021 18:48:30 -0000 X-APM-Out-ID: 16293989109302 X-APM-Authkey: 257869/1(257869/1) 5 Received: from unknown (HELO ?192.168.1.214?) (81.138.1.83) by smtp001.apm-internet.net with SMTP; 19 Aug 2021 18:48:30 -0000 From: Iain Sandoe Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.21\)) Subject: [PATCH] configure: Allow a host makefile fragment to override PIE flag settings. Message-Id: <7F4EA5FF-0CDC-4C0C-BF2B-B276C1A4E434@sandoe.co.uk> Date: Thu, 19 Aug 2021 19:48:29 +0100 To: GCC Patches X-Mailer: Apple Mail (2.3445.104.21) X-Spam-Status: No, score=-15.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_COUK, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, 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: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Hi, This concerns the settings of flags (using the host makefile fragment) for tools that will run on the host. At present the (no)PIE flags are computed in gcc/configure but it is not possible to override them (either from higher level Makefile or from the command line). Secondly the ordering of placement of flags assumes ELF semantics are OK for ordering of -fno-PIE and -fPIC. For Darwin, this introduces problems if fno-PIE causes PIC to be switched off and the bootstrap compiler does not support mdynamic-no-pic (which is the case when we bootstrap a 32b toolchain with clang). This causes the host files to be built '-static' which is not legal for user-space code, and the build terminates with illegal relocations (so that bootstrap fails). This patch: 1. Allows the computed PIE flags to be overridden by the top level configure. 2. Allows a host fragment to set values on the basis of the configured host platform/version. 3. Sets suitable values for the Darwin cases that currently fail. tested on i686,powerpc,x86-64-darwin, x86_64, powerpc64-linux, OK for master? thanks Iain Signed-off-by: Iain Sandoe ChangeLog: * Makefile.in: Regenerated. * Makefile.tpl: Add PIE flags to HOST_EXPORTS and POST_STAGE1_HOST_EXPORTS as specified by the host makefile fragment. config/ChangeLog: * mh-darwin: Specify suitable PIE/PIC flags for 32b Darwin hosts. gcc/ChangeLog: * configure: Regenerate. * configure.ac: Allow top level configure to override assumed PIE flags. --- Makefile.in | 14 ++++++++++++++ Makefile.tpl | 14 ++++++++++++++ config/mh-darwin | 20 ++++++++++++++++---- gcc/configure | 4 ++-- gcc/configure.ac | 4 ++-- 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/Makefile.tpl b/Makefile.tpl index 9adf4f94728..9523be5a761 100644 --- a/Makefile.tpl +++ b/Makefile.tpl @@ -576,6 +576,20 @@ all: @host_makefile_frag@ ### +# Allow host makefile fragment to override PIE settings. +ifneq ($(STAGE1_NO_PIE_CFLAGS),) + HOST_EXPORTS += export NO_PIE_CFLAGS="$(STAGE1_NO_PIE_CFLAGS)"; +endif +ifneq ($(STAGE1_NO_PIE_FLAG),) + HOST_EXPORTS += export NO_PIE_FLAG="$(STAGE1_NO_PIE_FLAG)"; +endif +ifneq ($(BOOT_NO_PIE_CFLAGS),) + POSTSTAGE1_HOST_EXPORTS += export NO_PIE_CFLAGS="$(BOOT_NO_PIE_CFLAGS)"; +endif +ifneq ($(BOOT_NO_PIE_FLAG),) + POSTSTAGE1_HOST_EXPORTS += export NO_PIE_FLAG="$(BOOT_NO_PIE_FLAG)"; +endif + # This is the list of directories that may be needed in RPATH_ENVVAR # so that programs built for the target machine work. TARGET_LIB_PATH = [+ FOR target_modules +][+ diff --git a/config/mh-darwin b/config/mh-darwin index b72835ae953..d3c357a0574 100644 --- a/config/mh-darwin +++ b/config/mh-darwin @@ -7,6 +7,13 @@ # We use Werror, since some versions of clang report unknown command line flags # as a warning only. +# In addition, all versions of clang released to date treat -fno-PIE in -m32 +# compilations as switching PIC code off too, which means that -fno-PIE, +# without -mdynamic-no-pic produces broken relocations (and we cannot enable +# -mdynamic-no-pic because the inverse setting doesn't work). To work around +# this, we need to ensure that the no-PIE option is followed by -fPIE, when +# the compiler does not support mdynamic-no-pic. + # We only need to determine this for the host tool used to build stage1 (or a # non-bootstrapped compiler), later stages will be built by GCC which supports # the required flags. @@ -24,23 +31,28 @@ endif @if gcc-bootstrap ifeq (${BOOTSTRAP_TOOL_CAN_USE_MDYNAMIC_NO_PIC},true) STAGE1_CFLAGS += -mdynamic-no-pic +STAGE1_NO_PIE_CFLAGS = -fno-PIE else STAGE1_CFLAGS += -fPIC +STAGE1_NO_PIE_CFLAGS = -fno-PIE -fPIC endif ifeq (${host_shared},no) # Add -mdynamic-no-pic to later stages when we know it is built with GCC. BOOT_CFLAGS += -mdynamic-no-pic +BOOT_NO_PIE_CFLAGS = -fno-PIE +else +BOOT_NO_PIE_CFLAGS = -fno-PIE -fPIC endif @endif gcc-bootstrap @unless gcc-bootstrap ifeq (${BOOTSTRAP_TOOL_CAN_USE_MDYNAMIC_NO_PIC},true) -# FIXME: we should also enable this for cross and non-bootstrap builds but -# that needs amendment to libcc1. -# CFLAGS += -mdynamic-no-pic -# CXXFLAGS += -mdynamic-no-pic +CFLAGS += -mdynamic-no-pic +CXXFLAGS += -mdynamic-no-pic +STAGE1_NO_PIE_CFLAGS = -fno-PIE else CFLAGS += -fPIC CXXFLAGS += -fPIC +STAGE1_NO_PIE_CFLAGS = -fno-PIE -fPIC endif @endunless gcc-bootstrap diff --git a/gcc/configure.ac b/gcc/configure.ac index ad8fa5a4604..fad9b27879e 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -7580,7 +7580,7 @@ AC_CACHE_CHECK([for -fno-PIE option], [gcc_cv_c_no_fpie=no]) CXXFLAGS="$saved_CXXFLAGS"]) if test "$gcc_cv_c_no_fpie" = "yes"; then - NO_PIE_CFLAGS="-fno-PIE" + NO_PIE_CFLAGS=${NO_PIE_CFLAGS-"-fno-PIE"} fi AC_SUBST([NO_PIE_CFLAGS]) @@ -7594,7 +7594,7 @@ AC_CACHE_CHECK([for -no-pie option], [gcc_cv_no_pie=no]) LDFLAGS="$saved_LDFLAGS"]) if test "$gcc_cv_no_pie" = "yes"; then - NO_PIE_FLAG="-no-pie" + NO_PIE_FLAG=${NO_PIE_FLAG-"-no-pie"} fi AC_SUBST([NO_PIE_FLAG])