Re: devel/llvm: make clang build working static PIE programs
On Mon, Jul 04, 2016 at 06:00:38PM +0200, Stefan Kempf wrote: > ping? looking at gcc -dumpspecs, this makes sense. ok i'm working on the same thing for gcc 4.9 now (sparc64 for a start) > > Stefan Kempf wrote: > > clang currently links against /usr/lib/crt0.o when building > > a binary with the -static -pie options. That makes such > > programs segfault on startup (gcc 4.9 seems to have the same > > problem). > > > > When building a static PIE program, we need to link against > > /usr/lib/rcrt0.o, as shown below. Bitrig has this part also > > in their local llvm tree. I'll try to get it into upstream for > > clang 3.9 as well. > > > > --- tools/clang/lib/Driver/Tools.cpp.orig Fri Feb 12 23:51:41 2016 > > +++ tools/clang/lib/Driver/Tools.cppSun Jun 26 20:24:44 2016 > > @@ -7600,6 +7600,10 @@ void openbsd::Linker::ConstructJob(Compilation , > > con > >if (Args.hasArg(options::OPT_pg)) > > CmdArgs.push_back( > > Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); > > + else if (Args.hasArg(options::OPT_static) && > > + !Args.hasArg(options::OPT_nopie)) > > +CmdArgs.push_back( > > +Args.MakeArgString(getToolChain().GetFilePath("rcrt0.o"))); > >else > > CmdArgs.push_back( > > Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); > > > > Full diff against the ports tree below. > > > > ok? > > > > Index: Makefile > > === > > RCS file: /cvs/ports/devel/llvm/Makefile,v > > retrieving revision 1.114 > > diff -u -p -r1.114 Makefile > > --- Makefile24 May 2016 07:53:23 - 1.114 > > +++ Makefile27 Jun 2016 17:24:32 - > > @@ -11,7 +11,7 @@ COMMENT = modular, fast C/C++/ObjC compi > > LLVM_V = 3.8.0 > > DISTNAME = llvm-${LLVM_V}.src > > PKGNAME = llvm-${LLVM_V} > > -REVISION = 1 > > +REVISION = 2 > > CATEGORIES = devel > > DISTFILES =llvm-${LLVM_V}.src${EXTRACT_SUFX} \ > > cfe-${LLVM_V}.src${EXTRACT_SUFX} > > Index: patches/patch-tools_clang_lib_Driver_Tools_cpp > > === > > RCS file: > > /cvs/ports/devel/llvm/patches/patch-tools_clang_lib_Driver_Tools_cpp,v > > retrieving revision 1.30 > > diff -u -p -r1.30 patch-tools_clang_lib_Driver_Tools_cpp > > --- patches/patch-tools_clang_lib_Driver_Tools_cpp 24 May 2016 07:53:23 > > - 1.30 > > +++ patches/patch-tools_clang_lib_Driver_Tools_cpp 27 Jun 2016 17:24:32 > > - > > @@ -1,6 +1,5 @@ > > -$OpenBSD: patch-tools_clang_lib_Driver_Tools_cpp,v 1.30 2016/05/24 > > 07:53:23 ajacoutot Exp $ > > tools/clang/lib/Driver/Tools.cpp.orig Fri Feb 12 17:51:41 2016 > > -+++ tools/clang/lib/Driver/Tools.cpp Tue May 17 14:45:22 2016 > > +--- tools/clang/lib/Driver/Tools.cpp.orig Fri Feb 12 23:51:41 2016 > > tools/clang/lib/Driver/Tools.cpp Sun Jun 26 20:24:44 2016 > > @@ -78,7 +78,7 @@ static const char *getSparcAsmModeForCPU(StringRef Nam > > .Case("niagara2", "-Av9b") > > .Case("niagara3", "-Av9d") > > @@ -10,7 +9,18 @@ $OpenBSD: patch-tools_clang_lib_Driver_T > > } else { > > return llvm::StringSwitch(Name) > > .Case("v8", "-Av8") > > -@@ -7611,15 +7611,17 @@ void openbsd::Linker::ConstructJob(Compilation , > > con > > +@@ -7600,6 +7600,10 @@ void openbsd::Linker::ConstructJob(Compilation , > > con > > + if (Args.hasArg(options::OPT_pg)) > > + CmdArgs.push_back( > > + Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); > > ++ else if (Args.hasArg(options::OPT_static) && > > ++ !Args.hasArg(options::OPT_nopie)) > > ++CmdArgs.push_back( > > ++Args.MakeArgString(getToolChain().GetFilePath("rcrt0.o"))); > > + else > > + CmdArgs.push_back( > > + Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); > > +@@ -7611,15 +7615,17 @@ void openbsd::Linker::ConstructJob(Compilation , > > con > > } > > } > > >
Re: devel/llvm: make clang build working static PIE programs
ping? Stefan Kempf wrote: > clang currently links against /usr/lib/crt0.o when building > a binary with the -static -pie options. That makes such > programs segfault on startup (gcc 4.9 seems to have the same > problem). > > When building a static PIE program, we need to link against > /usr/lib/rcrt0.o, as shown below. Bitrig has this part also > in their local llvm tree. I'll try to get it into upstream for > clang 3.9 as well. > > --- tools/clang/lib/Driver/Tools.cpp.orig Fri Feb 12 23:51:41 2016 > +++ tools/clang/lib/Driver/Tools.cpp Sun Jun 26 20:24:44 2016 > @@ -7600,6 +7600,10 @@ void openbsd::Linker::ConstructJob(Compilation , con >if (Args.hasArg(options::OPT_pg)) > CmdArgs.push_back( > Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); > + else if (Args.hasArg(options::OPT_static) && > + !Args.hasArg(options::OPT_nopie)) > +CmdArgs.push_back( > +Args.MakeArgString(getToolChain().GetFilePath("rcrt0.o"))); >else > CmdArgs.push_back( > Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); > > Full diff against the ports tree below. > > ok? > > Index: Makefile > === > RCS file: /cvs/ports/devel/llvm/Makefile,v > retrieving revision 1.114 > diff -u -p -r1.114 Makefile > --- Makefile 24 May 2016 07:53:23 - 1.114 > +++ Makefile 27 Jun 2016 17:24:32 - > @@ -11,7 +11,7 @@ COMMENT = modular, fast C/C++/ObjC compi > LLVM_V = 3.8.0 > DISTNAME = llvm-${LLVM_V}.src > PKGNAME =llvm-${LLVM_V} > -REVISION = 1 > +REVISION = 2 > CATEGORIES = devel > DISTFILES = llvm-${LLVM_V}.src${EXTRACT_SUFX} \ > cfe-${LLVM_V}.src${EXTRACT_SUFX} > Index: patches/patch-tools_clang_lib_Driver_Tools_cpp > === > RCS file: > /cvs/ports/devel/llvm/patches/patch-tools_clang_lib_Driver_Tools_cpp,v > retrieving revision 1.30 > diff -u -p -r1.30 patch-tools_clang_lib_Driver_Tools_cpp > --- patches/patch-tools_clang_lib_Driver_Tools_cpp24 May 2016 07:53:23 > - 1.30 > +++ patches/patch-tools_clang_lib_Driver_Tools_cpp27 Jun 2016 17:24:32 > - > @@ -1,6 +1,5 @@ > -$OpenBSD: patch-tools_clang_lib_Driver_Tools_cpp,v 1.30 2016/05/24 07:53:23 > ajacoutot Exp $ > tools/clang/lib/Driver/Tools.cpp.origFri Feb 12 17:51:41 2016 > -+++ tools/clang/lib/Driver/Tools.cpp Tue May 17 14:45:22 2016 > +--- tools/clang/lib/Driver/Tools.cpp.origFri Feb 12 23:51:41 2016 > tools/clang/lib/Driver/Tools.cpp Sun Jun 26 20:24:44 2016 > @@ -78,7 +78,7 @@ static const char *getSparcAsmModeForCPU(StringRef Nam > .Case("niagara2", "-Av9b") > .Case("niagara3", "-Av9d") > @@ -10,7 +9,18 @@ $OpenBSD: patch-tools_clang_lib_Driver_T > } else { > return llvm::StringSwitch(Name) > .Case("v8", "-Av8") > -@@ -7611,15 +7611,17 @@ void openbsd::Linker::ConstructJob(Compilation , > con > +@@ -7600,6 +7600,10 @@ void openbsd::Linker::ConstructJob(Compilation , con > + if (Args.hasArg(options::OPT_pg)) > + CmdArgs.push_back( > + Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); > ++ else if (Args.hasArg(options::OPT_static) && > ++ !Args.hasArg(options::OPT_nopie)) > ++CmdArgs.push_back( > ++Args.MakeArgString(getToolChain().GetFilePath("rcrt0.o"))); > + else > + CmdArgs.push_back( > + Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); > +@@ -7611,15 +7615,17 @@ void openbsd::Linker::ConstructJob(Compilation , > con > } > } >
devel/llvm: make clang build working static PIE programs
clang currently links against /usr/lib/crt0.o when building a binary with the -static -pie options. That makes such programs segfault on startup (gcc 4.9 seems to have the same problem). When building a static PIE program, we need to link against /usr/lib/rcrt0.o, as shown below. Bitrig has this part also in their local llvm tree. I'll try to get it into upstream for clang 3.9 as well. --- tools/clang/lib/Driver/Tools.cpp.orig Fri Feb 12 23:51:41 2016 +++ tools/clang/lib/Driver/Tools.cppSun Jun 26 20:24:44 2016 @@ -7600,6 +7600,10 @@ void openbsd::Linker::ConstructJob(Compilation , con if (Args.hasArg(options::OPT_pg)) CmdArgs.push_back( Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); + else if (Args.hasArg(options::OPT_static) && + !Args.hasArg(options::OPT_nopie)) +CmdArgs.push_back( +Args.MakeArgString(getToolChain().GetFilePath("rcrt0.o"))); else CmdArgs.push_back( Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); Full diff against the ports tree below. ok? Index: Makefile === RCS file: /cvs/ports/devel/llvm/Makefile,v retrieving revision 1.114 diff -u -p -r1.114 Makefile --- Makefile24 May 2016 07:53:23 - 1.114 +++ Makefile27 Jun 2016 17:24:32 - @@ -11,7 +11,7 @@ COMMENT = modular, fast C/C++/ObjC compi LLVM_V = 3.8.0 DISTNAME = llvm-${LLVM_V}.src PKGNAME = llvm-${LLVM_V} -REVISION = 1 +REVISION = 2 CATEGORIES = devel DISTFILES =llvm-${LLVM_V}.src${EXTRACT_SUFX} \ cfe-${LLVM_V}.src${EXTRACT_SUFX} Index: patches/patch-tools_clang_lib_Driver_Tools_cpp === RCS file: /cvs/ports/devel/llvm/patches/patch-tools_clang_lib_Driver_Tools_cpp,v retrieving revision 1.30 diff -u -p -r1.30 patch-tools_clang_lib_Driver_Tools_cpp --- patches/patch-tools_clang_lib_Driver_Tools_cpp 24 May 2016 07:53:23 - 1.30 +++ patches/patch-tools_clang_lib_Driver_Tools_cpp 27 Jun 2016 17:24:32 - @@ -1,6 +1,5 @@ -$OpenBSD: patch-tools_clang_lib_Driver_Tools_cpp,v 1.30 2016/05/24 07:53:23 ajacoutot Exp $ tools/clang/lib/Driver/Tools.cpp.orig Fri Feb 12 17:51:41 2016 -+++ tools/clang/lib/Driver/Tools.cpp Tue May 17 14:45:22 2016 +--- tools/clang/lib/Driver/Tools.cpp.orig Fri Feb 12 23:51:41 2016 tools/clang/lib/Driver/Tools.cpp Sun Jun 26 20:24:44 2016 @@ -78,7 +78,7 @@ static const char *getSparcAsmModeForCPU(StringRef Nam .Case("niagara2", "-Av9b") .Case("niagara3", "-Av9d") @@ -10,7 +9,18 @@ $OpenBSD: patch-tools_clang_lib_Driver_T } else { return llvm::StringSwitch(Name) .Case("v8", "-Av8") -@@ -7611,15 +7611,17 @@ void openbsd::Linker::ConstructJob(Compilation , con +@@ -7600,6 +7600,10 @@ void openbsd::Linker::ConstructJob(Compilation , con + if (Args.hasArg(options::OPT_pg)) + CmdArgs.push_back( + Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); ++ else if (Args.hasArg(options::OPT_static) && ++ !Args.hasArg(options::OPT_nopie)) ++CmdArgs.push_back( ++Args.MakeArgString(getToolChain().GetFilePath("rcrt0.o"))); + else + CmdArgs.push_back( + Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); +@@ -7611,15 +7615,17 @@ void openbsd::Linker::ConstructJob(Compilation , con } }