diff options
Diffstat (limited to 'compiler/main')
-rw-r--r-- | compiler/main/DriverPipeline.hs | 9 | ||||
-rw-r--r-- | compiler/main/SysTools.hs | 13 |
2 files changed, 22 insertions, 0 deletions
diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs index b578612ac4..23badbd885 100644 --- a/compiler/main/DriverPipeline.hs +++ b/compiler/main/DriverPipeline.hs @@ -1859,6 +1859,11 @@ linkBinary' staticLink dflags o_files dep_packages = do ++ map SysTools.Option ( [] +#if GCC_SUPPORTS_NO_PIE + -- See Note [No PIE eating when linking] + ++ ["-no-pie"] +#endif + -- 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 @@ -2157,6 +2162,10 @@ joinObjectFiles dflags o_files output_fn = do SysTools.Option "-nostdlib", SysTools.Option "-Wl,-r" ] +#if GCC_SUPPORTS_NO_PIE + -- See Note [No PIE eating while linking] in SysTools + ++ [SysTools.Option "-no-pie"] +#endif ++ (if any (cc ==) [Clang, AppleClang, AppleClang51] then [] else [SysTools.Option "-nodefaultlibs"]) diff --git a/compiler/main/SysTools.hs b/compiler/main/SysTools.hs index 5fb92c8583..82a6383dd5 100644 --- a/compiler/main/SysTools.hs +++ b/compiler/main/SysTools.hs @@ -1546,6 +1546,15 @@ linesPlatform xs = #endif +{- +Note [No PIE eating while linking] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +As of 2016 some Linux distributions (e.g. Debian) have started enabling -pie by +default in their gcc builds. This is incompatible with -r as it implies that we +are producing an executable. Consequently, we must manually pass -no-pie to gcc +when joining object files or linking dynamic libraries. See #12759. +-} + linkDynLib :: DynFlags -> [String] -> [InstalledUnitId] -> IO () linkDynLib dflags0 o_files dep_packages = do @@ -1711,6 +1720,10 @@ linkDynLib dflags0 o_files dep_packages ++ [ Option "-o" , FileOption "" output_fn ] +#if GCC_SUPPORTS_NO_PIE + -- See Note [No PIE eating when linking] + ++ [ Option "-no-pie" ] +#endif ++ map Option o_files ++ [ Option "-shared" ] ++ map Option bsymbolicFlag |