--- 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")
           .Case("niagara4", "-Av9d")
-          .Default("-Av9");
+          .Default("-Av9a");
   } else {
     return llvm::StringSwitch<const char *>(Name)
           .Case("v8", "-Av8")
@@ -7600,6 +7600,10 @@ void openbsd::Linker::ConstructJob(Compilation &C, 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 &C, con
     }
   }
 
-  std::string Triple = getToolChain().getTripleString();
-  if (Triple.substr(0, 6) == "x86_64")
-    Triple.replace(0, 6, "amd64");
-  CmdArgs.push_back(
-      Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
-
   Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
                             options::OPT_e, options::OPT_s, options::OPT_t,
                             options::OPT_Z_Flag, options::OPT_r});
+
+  std::string Triple = getToolChain().getTripleString();
+  if (Triple.substr(0, 5) == "amd64")
+    Triple.replace(0, 5, "x86_64");
+  CmdArgs.push_back(
+      Args.MakeArgString("-L${LOCALBASE}/lib/gcc/" + Triple + "/${GCC_VER}"));
+  CmdArgs.push_back(
+      Args.MakeArgString("-L${LOCALBASE}/lib"));
 
   AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
 
