[commit: ghc] ghc-7.10: Pass -no-pie to GCC (2dfae4d)
git at git.haskell.org
git at git.haskell.org
Sat Aug 11 16:01:24 UTC 2018
Repository : ssh://git@git.haskell.org/ghc
On branch : ghc-7.10
Link : http://ghc.haskell.org/trac/ghc/changeset/2dfae4d5d5c509f09d8e67a52094b3719fd75e8c/ghc
>---------------------------------------------------------------
commit 2dfae4d5d5c509f09d8e67a52094b3719fd75e8c
Author: Ben Gamari <bgamari.foss at gmail.com>
Date: Fri Nov 11 12:05:21 2016 -0500
Pass -no-pie to GCC
Certain distributions (e.g. Debian and Ubuntu) have enabled PIE be
default in their GCC packaging. This breaks our abuse of GCC as a linker
which requires that we pass -Wl,-r, which is incompatible with
PIE (since the former implies that we are generating a relocatable
object file and the latter an executable).
This is a second attempt at D2691. This attempt constrasts with D2691 in that
it preserves the "does gcc support -no-pie" flag in settings, allowing this to
be reconfigured by `configure` during installation of a binary distribution.
Thanks for @rwbarton for drawing attention to this issue.
Test Plan: Validate
Reviewers: austin, hvr, erikd
Reviewed By: erikd
Subscribers: thomie, rwbarton, erikd
Differential Revision: https://phabricator.haskell.org/D2693
GHC Trac Issues: #12759
(cherry picked from commit d421a7e22e0be3de32376970b8c38ec308f959da)
>---------------------------------------------------------------
2dfae4d5d5c509f09d8e67a52094b3719fd75e8c
aclocal.m4 | 21 +++++++++++++++++++++
compiler/main/DriverPipeline.hs | 10 ++++++++++
compiler/main/DynFlags.hs | 1 +
compiler/main/SysTools.hs | 6 ++++++
configure.ac | 3 +++
distrib/configure.ac.in | 1 +
settings.in | 1 +
7 files changed, 43 insertions(+)
diff --git a/aclocal.m4 b/aclocal.m4
index 874e190..b58d181 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -489,12 +489,14 @@ AC_DEFUN([FP_SETTINGS],
fi
SettingsCCompilerFlags="$CONF_CC_OPTS_STAGE2"
SettingsCCompilerLinkFlags="$CONF_GCC_LINKER_OPTS_STAGE2"
+ SettingsCCompilerSupportsNoPie="$CONF_GCC_SUPPORTS_NO_PIE"
SettingsLdFlags="$CONF_LD_LINKER_OPTS_STAGE2"
AC_SUBST(SettingsCCompilerCommand)
AC_SUBST(SettingsHaskellCPPCommand)
AC_SUBST(SettingsHaskellCPPFlags)
AC_SUBST(SettingsCCompilerFlags)
AC_SUBST(SettingsCCompilerLinkFlags)
+ AC_SUBST(SettingsCCompilerSupportsNoPie)
AC_SUBST(SettingsLdCommand)
AC_SUBST(SettingsLdFlags)
AC_SUBST(SettingsArCommand)
@@ -1249,6 +1251,25 @@ AC_SUBST(GccIsClang)
rm -f conftest.txt
])
+# FP_GCC_SUPPORTS_NO_PIE
+# ----------------------
+# Does gcc support the -no-pie option? If so we should pass it to gcc when
+# joining objects since -pie may be enabled by default.
+AC_DEFUN([FP_GCC_SUPPORTS_NO_PIE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_MSG_CHECKING([whether GCC supports -no-pie])
+ echo 'int main() { return 0; }' > conftest.c
+ if ${CC-cc} -o conftest -no-pie conftest.c > /dev/null 2>&1; then
+ CONF_GCC_SUPPORTS_NO_PIE=YES
+ AC_MSG_RESULT([yes])
+ else
+ CONF_GCC_SUPPORTS_NO_PIE=NO
+ AC_MSG_RESULT([no])
+ fi
+ rm -f conftest.c conftest.o conftest
+])
+
dnl Small feature test for perl version. Assumes PerlCmd
dnl contains path to perl binary.
dnl
diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs
index ff71cb4..3eb0327 100644
--- a/compiler/main/DriverPipeline.hs
+++ b/compiler/main/DriverPipeline.hs
@@ -1944,6 +1944,11 @@ linkBinary' staticLink dflags o_files dep_packages = do
++ map SysTools.Option (
[]
+ -- See Note [No PIE eating when linking]
+ ++ (if sGccSupportsNoPie mySettings
+ then ["-no-pie"]
+ else [])
+
-- Permit the linker to auto link _symbol to _imp_symbol.
-- This lets us link against DLLs without needing an "import library".
++ (if platformOS platform == OSMinGW32
@@ -2198,6 +2203,11 @@ joinObjectFiles dflags o_files output_fn = do
SysTools.Option "-nostdlib",
SysTools.Option "-Wl,-r"
]
+ -- See Note [No PIE eating while linking] in SysTools
+ ++ (if sGccSupportsNoPie mySettings
+ then [SysTools.Option "-no-pie"]
+ else [])
+
++ (if any (cc ==) [Clang, AppleClang, AppleClang51]
then []
else [SysTools.Option "-nodefaultlibs"])
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 42ac14e..9942d7a 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -922,6 +922,7 @@ data Settings = Settings {
sLdSupportsBuildId :: Bool,
sLdSupportsFilelist :: Bool,
sLdIsGnuLd :: Bool,
+ sGccSupportsNoPie :: Bool,
-- commands for particular phases
sPgm_L :: String,
sPgm_P :: (String,[Option]),
diff --git a/compiler/main/SysTools.hs b/compiler/main/SysTools.hs
index 8c3ab1a..078cc2b 100644
--- a/compiler/main/SysTools.hs
+++ b/compiler/main/SysTools.hs
@@ -242,6 +242,7 @@ initSysTools mbMinusB
-- to make that possible, so for now you can't.
gcc_prog <- getSetting "C compiler command"
gcc_args_str <- getSetting "C compiler flags"
+ gccSupportsNoPie <- getBooleanSetting "C compiler supports -no-pie"
cpp_prog <- getSetting "Haskell CPP command"
cpp_args_str <- getSetting "Haskell CPP flags"
let unreg_gcc_args = if targetUnregisterised
@@ -333,6 +334,7 @@ initSysTools mbMinusB
sLdSupportsBuildId = ldSupportsBuildId,
sLdSupportsFilelist = ldSupportsFilelist,
sLdIsGnuLd = ldIsGnuLd,
+ sGccSupportsNoPie = gccSupportsNoPie,
sProgramName = "ghc",
sProjectVersion = cProjectVersion,
sPgm_L = unlit_path,
@@ -1719,6 +1721,10 @@ linkDynLib dflags0 o_files dep_packages
++ [ Option "-o"
, FileOption "" output_fn
]
+ -- See Note [No PIE eating when linking]
+ ++ (if sGccSupportsNoPie (settings dflags)
+ then [Option "-no-pie"]
+ else [])
++ map Option o_files
++ [ Option "-shared" ]
++ map Option bsymbolicFlag
diff --git a/configure.ac b/configure.ac
index 37601ae..84f063a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -667,6 +667,9 @@ dnl If gcc, make sure it's at least 3.0
dnl
FP_GCC_VERSION
+dnl ** See whether gcc supports -no-pie
+FP_GCC_SUPPORTS_NO_PIE
+
dnl ** look to see if we have a C compiler using an llvm back end.
dnl
FP_CC_LLVM_BACKEND
diff --git a/distrib/configure.ac.in b/distrib/configure.ac.in
index f1abd91..5935775 100644
--- a/distrib/configure.ac.in
+++ b/distrib/configure.ac.in
@@ -92,6 +92,7 @@ FIND_LD([LdCmd])
AC_SUBST([LdCmd])
FP_GCC_VERSION
+FP_GCC_SUPPORTS_NO_PIE
AC_PROG_CPP
FP_PROG_LD_IS_GNU
diff --git a/settings.in b/settings.in
index 5f54fd9..1f2ec3d 100644
--- a/settings.in
+++ b/settings.in
@@ -2,6 +2,7 @@
("C compiler command", "@SettingsCCompilerCommand@"),
("C compiler flags", "@SettingsCCompilerFlags@"),
("C compiler link flags", "@SettingsCCompilerLinkFlags@"),
+ ("C compiler supports -no-pie", "@SettingsCCompilerSupportsNoPie@"),
("Haskell CPP command","@SettingsHaskellCPPCommand@"),
("Haskell CPP flags","@SettingsHaskellCPPFlags@"),
("ld command", "@SettingsLdCommand@"),
More information about the ghc-commits
mailing list