forked from OSchip/llvm-project
Cleanup FreeBSD linking and add support for -pie.
Path by Brooks Davis, tests and fixes from me. llvm-svn: 162761
This commit is contained in:
parent
3a6af66a0e
commit
afe2f23a3c
|
@ -5160,7 +5160,9 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
const InputInfoList &Inputs,
|
||||
const ArgList &Args,
|
||||
const char *LinkingOutput) const {
|
||||
const Driver &D = getToolChain().getDriver();
|
||||
const toolchains::FreeBSD& ToolChain =
|
||||
static_cast<const toolchains::FreeBSD&>(getToolChain());
|
||||
const Driver &D = ToolChain.getDriver();
|
||||
ArgStringList CmdArgs;
|
||||
|
||||
// Silence warning for "clang -g foo.o -o foo"
|
||||
|
@ -5174,6 +5176,9 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
if (!D.SysRoot.empty())
|
||||
CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
|
||||
|
||||
if (Args.hasArg(options::OPT_pie))
|
||||
CmdArgs.push_back("-pie");
|
||||
|
||||
if (Args.hasArg(options::OPT_static)) {
|
||||
CmdArgs.push_back("-Bstatic");
|
||||
} else {
|
||||
|
@ -5186,8 +5191,8 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
CmdArgs.push_back("-dynamic-linker");
|
||||
CmdArgs.push_back("/libexec/ld-elf.so.1");
|
||||
}
|
||||
if (getToolChain().getTriple().getOSMajorVersion() >= 9) {
|
||||
llvm::Triple::ArchType Arch = getToolChain().getArch();
|
||||
if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
|
||||
llvm::Triple::ArchType Arch = ToolChain.getArch();
|
||||
if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
|
||||
Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
|
||||
CmdArgs.push_back("--hash-style=both");
|
||||
|
@ -5198,12 +5203,12 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
|
||||
// When building 32-bit code on FreeBSD/amd64, we have to explicitly
|
||||
// instruct ld in the base system to link 32-bit code.
|
||||
if (getToolChain().getArchName() == "i386") {
|
||||
if (ToolChain.getArchName() == "i386") {
|
||||
CmdArgs.push_back("-m");
|
||||
CmdArgs.push_back("elf_i386_fbsd");
|
||||
}
|
||||
|
||||
if (getToolChain().getArchName() == "powerpc") {
|
||||
if (ToolChain.getArchName() == "powerpc") {
|
||||
CmdArgs.push_back("-m");
|
||||
CmdArgs.push_back("elf32ppc_fbsd");
|
||||
}
|
||||
|
@ -5217,29 +5222,33 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
|
||||
if (!Args.hasArg(options::OPT_nostdlib) &&
|
||||
!Args.hasArg(options::OPT_nostartfiles)) {
|
||||
const char *crt1 = NULL;
|
||||
if (!Args.hasArg(options::OPT_shared)) {
|
||||
if (Args.hasArg(options::OPT_pg))
|
||||
CmdArgs.push_back(Args.MakeArgString(
|
||||
getToolChain().GetFilePath("gcrt1.o")));
|
||||
else {
|
||||
const char *crt = Args.hasArg(options::OPT_pie) ? "Scrt1.o" : "crt1.o";
|
||||
CmdArgs.push_back(Args.MakeArgString(
|
||||
getToolChain().GetFilePath(crt)));
|
||||
}
|
||||
CmdArgs.push_back(Args.MakeArgString(
|
||||
getToolChain().GetFilePath("crti.o")));
|
||||
CmdArgs.push_back(Args.MakeArgString(
|
||||
getToolChain().GetFilePath("crtbegin.o")));
|
||||
} else {
|
||||
CmdArgs.push_back(Args.MakeArgString(
|
||||
getToolChain().GetFilePath("crti.o")));
|
||||
CmdArgs.push_back(Args.MakeArgString(
|
||||
getToolChain().GetFilePath("crtbeginS.o")));
|
||||
crt1 = "gcrt1.o";
|
||||
else if (Args.hasArg(options::OPT_pie))
|
||||
crt1 = "Scrt1.o";
|
||||
else
|
||||
crt1 = "crt1.o";
|
||||
}
|
||||
if (crt1)
|
||||
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
|
||||
|
||||
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
|
||||
|
||||
const char *crtbegin = NULL;
|
||||
if (Args.hasArg(options::OPT_static))
|
||||
crtbegin = "crtbeginT.o";
|
||||
else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
|
||||
crtbegin = "crtbeginS.o";
|
||||
else
|
||||
crtbegin = "crtbegin.o";
|
||||
|
||||
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
|
||||
}
|
||||
|
||||
Args.AddAllArgs(CmdArgs, options::OPT_L);
|
||||
const ToolChain::path_list Paths = getToolChain().getFilePaths();
|
||||
const ToolChain::path_list Paths = ToolChain.getFilePaths();
|
||||
for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
|
||||
i != e; ++i)
|
||||
CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
|
||||
|
@ -5250,12 +5259,12 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
|
||||
Args.AddAllArgs(CmdArgs, options::OPT_r);
|
||||
|
||||
AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
|
||||
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
|
||||
|
||||
if (!Args.hasArg(options::OPT_nostdlib) &&
|
||||
!Args.hasArg(options::OPT_nodefaultlibs)) {
|
||||
if (D.CCCIsCXX) {
|
||||
getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
|
||||
ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
|
||||
if (Args.hasArg(options::OPT_pg))
|
||||
CmdArgs.push_back("-lm_p");
|
||||
else
|
||||
|
@ -5309,19 +5318,16 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
if (!Args.hasArg(options::OPT_nostdlib) &&
|
||||
!Args.hasArg(options::OPT_nostartfiles)) {
|
||||
if (!Args.hasArg(options::OPT_shared))
|
||||
CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
|
||||
"crtend.o")));
|
||||
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
|
||||
else
|
||||
CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
|
||||
"crtendS.o")));
|
||||
CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
|
||||
"crtn.o")));
|
||||
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
|
||||
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
|
||||
}
|
||||
|
||||
addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
|
||||
addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
|
||||
|
||||
const char *Exec =
|
||||
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
|
||||
Args.MakeArgString(ToolChain.GetProgramPath("ld"));
|
||||
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
|
||||
}
|
||||
|
||||
|
|
|
@ -44,3 +44,27 @@
|
|||
// CHECK-LDFLAGS9: --hash-style=both
|
||||
// CHECK-LDFLAGS9: --enable-new-dtags
|
||||
|
||||
// RUN: %clang -no-canonical-prefixes -target x86_64-pc-freebsd8 -static %s \
|
||||
// RUN: --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-STATIC %s
|
||||
// CHECK-STATIC: crt1.o
|
||||
// CHECK-STATIC: crtbeginT.o
|
||||
|
||||
// RUN: %clang -no-canonical-prefixes -target x86_64-pc-freebsd8 -shared %s \
|
||||
// RUN: --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-SHARED %s
|
||||
// CHECK-SHARED: crti.o
|
||||
// CHECK-SHARED: crtbeginS.o
|
||||
|
||||
// RUN: %clang -no-canonical-prefixes -target x86_64-pc-freebsd8 -pie %s \
|
||||
// RUN: --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-PIE %s
|
||||
// CHECK-PIE: pie
|
||||
// CHECK-PIE: Scrt1.o
|
||||
// CHECK-PIE: crtbeginS.o
|
||||
|
||||
// RUN: %clang -no-canonical-prefixes -target x86_64-pc-freebsd8 %s \
|
||||
// RUN: --sysroot=%S/Inputs/multiarch_freebsd64_tree -### 2>&1 \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-NORMAL %s
|
||||
// CHECK-NORMAL: crt1.o
|
||||
// CHECK-NORMAL: crtbegin.o
|
||||
|
|
Loading…
Reference in New Issue