Implement -pie.

llvm-svn: 119577
This commit is contained in:
Rafael Espindola 2010-11-17 22:26:15 +00:00
parent 55425e7f78
commit d47ac23154
2 changed files with 20 additions and 6 deletions

View File

@ -562,6 +562,7 @@ def private__bundle : Flag<"-private_bundle">;
def pthreads : Flag<"-pthreads">; def pthreads : Flag<"-pthreads">;
def pthread : Flag<"-pthread">; def pthread : Flag<"-pthread">;
def p : Flag<"-p">; def p : Flag<"-p">;
def pie : Flag<"-pie">;
def read__only__relocs : Separate<"-read_only_relocs">; def read__only__relocs : Separate<"-read_only_relocs">;
def remap : Flag<"-remap">; def remap : Flag<"-remap">;
def rewrite_objc : Flag<"-rewrite-objc">, Flags<[DriverOption]>, def rewrite_objc : Flag<"-rewrite-objc">, Flags<[DriverOption]>,

View File

@ -3224,6 +3224,9 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back(A->getValue(Args)); CmdArgs.push_back(A->getValue(Args));
} }
if (Args.hasArg(options::OPT_pie))
CmdArgs.push_back("-pie");
if (Args.hasArg(options::OPT_rdynamic)) if (Args.hasArg(options::OPT_rdynamic))
CmdArgs.push_back("-export-dynamic"); CmdArgs.push_back("-export-dynamic");
@ -3272,15 +3275,22 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back(Output.getFilename()); CmdArgs.push_back(Output.getFilename());
if (!Args.hasArg(options::OPT_nostdlib)) { if (!Args.hasArg(options::OPT_nostdlib)) {
if (!Args.hasArg(options::OPT_shared)) const char *crt1 = NULL;
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o"))); if (!Args.hasArg(options::OPT_shared)){
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"))); CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
const char *crtbegin; const char *crtbegin;
if (Args.hasArg(options::OPT_static)) if (Args.hasArg(options::OPT_static))
crtbegin = "crtbeginT.o"; crtbegin = "crtbeginT.o";
else if (Args.hasArg(options::OPT_shared)) else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
crtbegin = "crtbeginS.o"; crtbegin = "crtbeginS.o";
else else
crtbegin = "crtbegin.o"; crtbegin = "crtbegin.o";
@ -3350,10 +3360,13 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-lgcc"); CmdArgs.push_back("-lgcc");
} }
if (Args.hasArg(options::OPT_shared)) const char *crtend;
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o"))); if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
crtend = "crtendS.o";
else else
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); crtend = "crtend.o";
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
} }