Re: devel/llvm: make clang build working static PIE programs

2016-07-06 Thread Tobias Ulmer

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

2016-07-04 Thread Stefan Kempf
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

2016-06-27 Thread Stefan Kempf
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
  }
}