Date: Mon, 27 Aug 2012 16:18:53 +0000 (UTC) From: Brooks Davis <brooks@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r303233 - in head/lang/clang-devel: . files Message-ID: <201208271618.q7RGIrjf023303@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: brooks Date: Mon Aug 27 16:18:52 2012 New Revision: 303233 URL: http://svn.freebsd.org/changeset/ports/303233 Log: Fix creation of position independent executables (-fPIE -pie). There were two bugs here. First, -pie was not passed to ld. Second, non-relocatable versions of three *crt*.o archives were used in the pie case. Additionally, link with crtbeginT.o in the -static case. Shift style towards that of the Linux code since much of the new login was cribbed from it. Reported by: jonathan Modified: head/lang/clang-devel/Makefile head/lang/clang-devel/files/patch-tools_clang_lib_Driver_Tools.cpp Modified: head/lang/clang-devel/Makefile ============================================================================== --- head/lang/clang-devel/Makefile Mon Aug 27 16:10:54 2012 (r303232) +++ head/lang/clang-devel/Makefile Mon Aug 27 16:18:52 2012 (r303233) @@ -7,6 +7,7 @@ PORTNAME= clang PORTVERSION= 3.2.r${SVN_REV} +PORTREVISION= 1 CATEGORIES= lang devel MASTER_SITES= ${MASTER_SITE_LOCAL} MASTER_SITE_SUBDIR= brooks Modified: head/lang/clang-devel/files/patch-tools_clang_lib_Driver_Tools.cpp ============================================================================== --- head/lang/clang-devel/files/patch-tools_clang_lib_Driver_Tools.cpp Mon Aug 27 16:10:54 2012 (r303232) +++ head/lang/clang-devel/files/patch-tools_clang_lib_Driver_Tools.cpp Mon Aug 27 16:18:52 2012 (r303233) @@ -60,3 +60,146 @@ $FreeBSD$ Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); +@@ -5153,7 +5184,9 @@ + const InputInfoList &Inputs, + const ArgList &Args, + const char *LinkingOutput) const { +- const Driver &D = getToolChain().getDriver(); ++ const toolchains::Linux& ToolChain = ++ static_cast<const toolchains::Linux&>(getToolChain()); ++ const Driver &D = ToolChain.getDriver(); + ArgStringList CmdArgs; + + // Silence warning for "clang -g foo.o -o foo" +@@ -5167,6 +5200,9 @@ + 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 { +@@ -5179,8 +5215,8 @@ + 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"); +@@ -5191,12 +5227,12 @@ + + // 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"); + } +@@ -5210,29 +5246,32 @@ + + if (!Args.hasArg(options::OPT_nostdlib) && + !Args.hasArg(options::OPT_nostartfiles)) { +- if (!Args.hasArg(options::OPT_shared)) { ++ 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; ++ 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)); +@@ -5243,12 +5282,12 @@ + 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 +@@ -5301,20 +5340,20 @@ + + 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"))); ++ const char *crtend; ++ if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) ++ crtend = "crtendS.o"; + else +- CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( +- "crtendS.o"))); +- CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( +- "crtn.o"))); ++ crtend = "crtend.o"; ++ ++ CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); ++ 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)); + } +
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208271618.q7RGIrjf023303>