nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at netboot-syslinux-multiplatform 157 lines 7.1 kB view raw
1commit 7a9842bc92921e79b84630045276861be90b2d47 2Author: Siva Chandra <sivachandra@google.com> 3Date: Wed Feb 20 19:07:04 2019 +0000 4 5 [Clang Driver] Add support for "-static-pie" argument to the Clang driver. 6 7 Summary: This change mimics GCC's support for the "-static-pie" argument. 8 9 Subscribers: cfe-commits 10 11 Tags: #clang 12 13 Differential Revision: https://reviews.llvm.org/D58307 14 15 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@354502 91177308-0d34-0410-b5e6-96231b3b80d8 16 (cherry picked from commit 7d6cd7825e6883f8650e32b07f3750824c2cef62) 17 18diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td 19index d02d9744d7..75a21e66c7 100644 20--- a/include/clang/Driver/Options.td 21+++ b/include/clang/Driver/Options.td 22@@ -2502,6 +2502,7 @@ def pthread : Flag<["-"], "pthread">, Flags<[CC1Option]>, 23 def no_pthread : Flag<["-"], "no-pthread">, Flags<[CC1Option]>; 24 def p : Flag<["-"], "p">; 25 def pie : Flag<["-"], "pie">; 26+def static_pie : Flag<["-"], "static-pie">; 27 def read__only__relocs : Separate<["-"], "read_only_relocs">; 28 def remap : Flag<["-"], "remap">; 29 def rewrite_objc : Flag<["-"], "rewrite-objc">, Flags<[DriverOption,CC1Option]>, 30diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp 31index d7e316befa..85ffc1618d 100644 32--- a/lib/Driver/ToolChains/CommonArgs.cpp 33+++ b/lib/Driver/ToolChains/CommonArgs.cpp 34@@ -1138,19 +1138,22 @@ static void AddLibgcc(const llvm::Triple &Triple, const Driver &D, 35 bool isCygMing = Triple.isOSCygMing(); 36 bool IsIAMCU = Triple.isOSIAMCU(); 37 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) || 38- Args.hasArg(options::OPT_static); 39+ Args.hasArg(options::OPT_static) || 40+ Args.hasArg(options::OPT_static_pie); 41 42 bool SharedLibgcc = Args.hasArg(options::OPT_shared_libgcc); 43 bool UnspecifiedLibgcc = !StaticLibgcc && !SharedLibgcc; 44 45 // Gcc adds libgcc arguments in various ways: 46 // 47- // gcc <none>: -lgcc --as-needed -lgcc_s --no-as-needed 48- // g++ <none>: -lgcc_s -lgcc 49- // gcc shared: -lgcc_s -lgcc 50- // g++ shared: -lgcc_s -lgcc 51- // gcc static: -lgcc -lgcc_eh 52- // g++ static: -lgcc -lgcc_eh 53+ // gcc <none>: -lgcc --as-needed -lgcc_s --no-as-needed 54+ // g++ <none>: -lgcc_s -lgcc 55+ // gcc shared: -lgcc_s -lgcc 56+ // g++ shared: -lgcc_s -lgcc 57+ // gcc static: -lgcc -lgcc_eh 58+ // g++ static: -lgcc -lgcc_eh 59+ // gcc static-pie: -lgcc -lgcc_eh 60+ // g++ static-pie: -lgcc -lgcc_eh 61 // 62 // Also, certain targets need additional adjustments. 63 64diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp 65index 69dba8fec8..0faa0bb473 100644 66--- a/lib/Driver/ToolChains/Gnu.cpp 67+++ b/lib/Driver/ToolChains/Gnu.cpp 68@@ -334,6 +334,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, 69 const bool isAndroid = ToolChain.getTriple().isAndroid(); 70 const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU(); 71 const bool IsPIE = getPIE(Args, ToolChain); 72+ const bool IsStaticPIE = Args.hasArg(options::OPT_static_pie); 73 const bool HasCRTBeginEndFiles = 74 ToolChain.getTriple().hasEnvironment() || 75 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies); 76@@ -354,6 +355,12 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, 77 if (IsPIE) 78 CmdArgs.push_back("-pie"); 79 80+ if (IsStaticPIE) { 81+ CmdArgs.push_back("-static"); 82+ CmdArgs.push_back("-pie"); 83+ CmdArgs.push_back("--no-dynamic-linker"); 84+ } 85+ 86 if (Args.hasArg(options::OPT_rdynamic)) 87 CmdArgs.push_back("-export-dynamic"); 88 89@@ -415,6 +422,8 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, 90 crt1 = "gcrt1.o"; 91 else if (IsPIE) 92 crt1 = "Scrt1.o"; 93+ else if (IsStaticPIE) 94+ crt1 = "rcrt1.o"; 95 else 96 crt1 = "crt1.o"; 97 } 98@@ -432,7 +441,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, 99 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o"; 100 else if (Args.hasArg(options::OPT_shared)) 101 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o"; 102- else if (IsPIE) 103+ else if (IsPIE || IsStaticPIE) 104 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o"; 105 else 106 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o"; 107@@ -483,7 +492,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, 108 109 if (!Args.hasArg(options::OPT_nostdlib)) { 110 if (!Args.hasArg(options::OPT_nodefaultlibs)) { 111- if (Args.hasArg(options::OPT_static)) 112+ if (Args.hasArg(options::OPT_static) || IsStaticPIE) 113 CmdArgs.push_back("--start-group"); 114 115 if (NeedsSanitizerDeps) 116@@ -518,7 +527,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, 117 if (IsIAMCU) 118 CmdArgs.push_back("-lgloss"); 119 120- if (Args.hasArg(options::OPT_static)) 121+ if (Args.hasArg(options::OPT_static) || IsStaticPIE) 122 CmdArgs.push_back("--end-group"); 123 else 124 AddRunTimeLibs(ToolChain, D, CmdArgs, Args); 125@@ -535,7 +544,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, 126 const char *crtend; 127 if (Args.hasArg(options::OPT_shared)) 128 crtend = isAndroid ? "crtend_so.o" : "crtendS.o"; 129- else if (IsPIE) 130+ else if (IsPIE || IsStaticPIE) 131 crtend = isAndroid ? "crtend_android.o" : "crtendS.o"; 132 else 133 crtend = isAndroid ? "crtend_android.o" : "crtend.o"; 134diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c 135index 3ab81be490..800f782523 100644 136--- a/test/Driver/linux-ld.c 137+++ b/test/Driver/linux-ld.c 138@@ -176,6 +176,19 @@ 139 // CHECK-CLANG-NO-LIBGCC-STATIC: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" 140 // CHECK-CLANG-NO-LIBGCC-STATIC: "--start-group" "-lgcc" "-lgcc_eh" "-lc" "--end-group" 141 // 142+// RUN: %clang -static-pie -no-canonical-prefixes %s -### -o %t.o 2>&1 \ 143+// RUN: --target=x86_64-unknown-linux -rtlib=platform \ 144+// RUN: --gcc-toolchain="" \ 145+// RUN: --sysroot=%S/Inputs/basic_linux_tree \ 146+// RUN: | FileCheck --check-prefix=CHECK-CLANG-LD-STATIC-PIE %s 147+// CHECK-CLANG-LD-STATIC-PIE: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" 148+// CHECK-CLANG-LD-STATIC-PIE: "-static" 149+// CHECK-CLANG-LD-STATIC-PIE: "-pie" 150+// CHECK-CLANG-LD-STATIC-PIE: "--no-dynamic-linker" 151+// CHECK-CLANG-LD-STATIC-PIE: "-m" "elf_x86_64" 152+// CHECK-CLANG-LD-STATIC-PIE: "{{.*}}rcrt1.o" 153+// CHECK-CLANG-LD-STATIC-PIE: "--start-group" "-lgcc" "-lgcc_eh" "-lc" "--end-group" 154+// 155 // RUN: %clang -dynamic -no-canonical-prefixes %s -### -o %t.o 2>&1 \ 156 // RUN: --target=x86_64-unknown-linux -rtlib=platform \ 157 // RUN: --gcc-toolchain="" \