nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
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="" \