158 lines
7.0 KiB
Diff
158 lines
7.0 KiB
Diff
commit 7a9842bc92921e79b84630045276861be90b2d47
|
|
Author: Siva Chandra <sivachandra@google.com>
|
|
Date: Wed Feb 20 19:07:04 2019 +0000
|
|
|
|
[Clang Driver] Add support for "-static-pie" argument to the Clang driver.
|
|
|
|
Summary: This change mimics GCC's support for the "-static-pie" argument.
|
|
|
|
Subscribers: cfe-commits
|
|
|
|
Tags: #clang
|
|
|
|
Differential Revision: https://reviews.llvm.org/D58307
|
|
|
|
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@354502 91177308-0d34-0410-b5e6-96231b3b80d8
|
|
(cherry picked from commit 7d6cd7825e6883f8650e32b07f3750824c2cef62)
|
|
|
|
diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
|
|
index d02d9744d7..75a21e66c7 100644
|
|
--- a/include/clang/Driver/Options.td
|
|
+++ b/include/clang/Driver/Options.td
|
|
@@ -2502,6 +2502,7 @@ def pthread : Flag<["-"], "pthread">, Flags<[CC1Option]>,
|
|
def no_pthread : Flag<["-"], "no-pthread">, Flags<[CC1Option]>;
|
|
def p : Flag<["-"], "p">;
|
|
def pie : Flag<["-"], "pie">;
|
|
+def static_pie : Flag<["-"], "static-pie">;
|
|
def read__only__relocs : Separate<["-"], "read_only_relocs">;
|
|
def remap : Flag<["-"], "remap">;
|
|
def rewrite_objc : Flag<["-"], "rewrite-objc">, Flags<[DriverOption,CC1Option]>,
|
|
diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp
|
|
index d7e316befa..85ffc1618d 100644
|
|
--- a/lib/Driver/ToolChains/CommonArgs.cpp
|
|
+++ b/lib/Driver/ToolChains/CommonArgs.cpp
|
|
@@ -1138,19 +1138,22 @@ static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
|
|
bool isCygMing = Triple.isOSCygMing();
|
|
bool IsIAMCU = Triple.isOSIAMCU();
|
|
bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
|
|
- Args.hasArg(options::OPT_static);
|
|
+ Args.hasArg(options::OPT_static) ||
|
|
+ Args.hasArg(options::OPT_static_pie);
|
|
|
|
bool SharedLibgcc = Args.hasArg(options::OPT_shared_libgcc);
|
|
bool UnspecifiedLibgcc = !StaticLibgcc && !SharedLibgcc;
|
|
|
|
// Gcc adds libgcc arguments in various ways:
|
|
//
|
|
- // gcc <none>: -lgcc --as-needed -lgcc_s --no-as-needed
|
|
- // g++ <none>: -lgcc_s -lgcc
|
|
- // gcc shared: -lgcc_s -lgcc
|
|
- // g++ shared: -lgcc_s -lgcc
|
|
- // gcc static: -lgcc -lgcc_eh
|
|
- // g++ static: -lgcc -lgcc_eh
|
|
+ // gcc <none>: -lgcc --as-needed -lgcc_s --no-as-needed
|
|
+ // g++ <none>: -lgcc_s -lgcc
|
|
+ // gcc shared: -lgcc_s -lgcc
|
|
+ // g++ shared: -lgcc_s -lgcc
|
|
+ // gcc static: -lgcc -lgcc_eh
|
|
+ // g++ static: -lgcc -lgcc_eh
|
|
+ // gcc static-pie: -lgcc -lgcc_eh
|
|
+ // g++ static-pie: -lgcc -lgcc_eh
|
|
//
|
|
// Also, certain targets need additional adjustments.
|
|
|
|
diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp
|
|
index 69dba8fec8..0faa0bb473 100644
|
|
--- a/lib/Driver/ToolChains/Gnu.cpp
|
|
+++ b/lib/Driver/ToolChains/Gnu.cpp
|
|
@@ -334,6 +334,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
const bool isAndroid = ToolChain.getTriple().isAndroid();
|
|
const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
|
|
const bool IsPIE = getPIE(Args, ToolChain);
|
|
+ const bool IsStaticPIE = Args.hasArg(options::OPT_static_pie);
|
|
const bool HasCRTBeginEndFiles =
|
|
ToolChain.getTriple().hasEnvironment() ||
|
|
(ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
|
|
@@ -354,6 +355,12 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
if (IsPIE)
|
|
CmdArgs.push_back("-pie");
|
|
|
|
+ if (IsStaticPIE) {
|
|
+ CmdArgs.push_back("-static");
|
|
+ CmdArgs.push_back("-pie");
|
|
+ CmdArgs.push_back("--no-dynamic-linker");
|
|
+ }
|
|
+
|
|
if (Args.hasArg(options::OPT_rdynamic))
|
|
CmdArgs.push_back("-export-dynamic");
|
|
|
|
@@ -415,6 +422,8 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
crt1 = "gcrt1.o";
|
|
else if (IsPIE)
|
|
crt1 = "Scrt1.o";
|
|
+ else if (IsStaticPIE)
|
|
+ crt1 = "rcrt1.o";
|
|
else
|
|
crt1 = "crt1.o";
|
|
}
|
|
@@ -432,7 +441,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
|
|
else if (Args.hasArg(options::OPT_shared))
|
|
crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
|
|
- else if (IsPIE)
|
|
+ else if (IsPIE || IsStaticPIE)
|
|
crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
|
|
else
|
|
crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
|
|
@@ -483,7 +492,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
|
|
if (!Args.hasArg(options::OPT_nostdlib)) {
|
|
if (!Args.hasArg(options::OPT_nodefaultlibs)) {
|
|
- if (Args.hasArg(options::OPT_static))
|
|
+ if (Args.hasArg(options::OPT_static) || IsStaticPIE)
|
|
CmdArgs.push_back("--start-group");
|
|
|
|
if (NeedsSanitizerDeps)
|
|
@@ -518,7 +527,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
if (IsIAMCU)
|
|
CmdArgs.push_back("-lgloss");
|
|
|
|
- if (Args.hasArg(options::OPT_static))
|
|
+ if (Args.hasArg(options::OPT_static) || IsStaticPIE)
|
|
CmdArgs.push_back("--end-group");
|
|
else
|
|
AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
|
|
@@ -535,7 +544,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|
const char *crtend;
|
|
if (Args.hasArg(options::OPT_shared))
|
|
crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
|
|
- else if (IsPIE)
|
|
+ else if (IsPIE || IsStaticPIE)
|
|
crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
|
|
else
|
|
crtend = isAndroid ? "crtend_android.o" : "crtend.o";
|
|
diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c
|
|
index 3ab81be490..800f782523 100644
|
|
--- a/test/Driver/linux-ld.c
|
|
+++ b/test/Driver/linux-ld.c
|
|
@@ -176,6 +176,19 @@
|
|
// CHECK-CLANG-NO-LIBGCC-STATIC: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
|
|
// CHECK-CLANG-NO-LIBGCC-STATIC: "--start-group" "-lgcc" "-lgcc_eh" "-lc" "--end-group"
|
|
//
|
|
+// RUN: %clang -static-pie -no-canonical-prefixes %s -### -o %t.o 2>&1 \
|
|
+// RUN: --target=x86_64-unknown-linux -rtlib=platform \
|
|
+// RUN: --gcc-toolchain="" \
|
|
+// RUN: --sysroot=%S/Inputs/basic_linux_tree \
|
|
+// RUN: | FileCheck --check-prefix=CHECK-CLANG-LD-STATIC-PIE %s
|
|
+// CHECK-CLANG-LD-STATIC-PIE: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
|
|
+// CHECK-CLANG-LD-STATIC-PIE: "-static"
|
|
+// CHECK-CLANG-LD-STATIC-PIE: "-pie"
|
|
+// CHECK-CLANG-LD-STATIC-PIE: "--no-dynamic-linker"
|
|
+// CHECK-CLANG-LD-STATIC-PIE: "-m" "elf_x86_64"
|
|
+// CHECK-CLANG-LD-STATIC-PIE: "{{.*}}rcrt1.o"
|
|
+// CHECK-CLANG-LD-STATIC-PIE: "--start-group" "-lgcc" "-lgcc_eh" "-lc" "--end-group"
|
|
+//
|
|
// RUN: %clang -dynamic -no-canonical-prefixes %s -### -o %t.o 2>&1 \
|
|
// RUN: --target=x86_64-unknown-linux -rtlib=platform \
|
|
// RUN: --gcc-toolchain="" \
|