Skip site navigation (1)Skip section navigation (2)
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>