Index: ELF/Config.h =================================================================== --- ELF/Config.h +++ ELF/Config.h @@ -14,6 +14,7 @@ #include "llvm/ADT/MapVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" +#include "llvm/ADT/Triple.h" #include "llvm/BinaryFormat/ELF.h" #include "llvm/Support/CachePruning.h" #include "llvm/Support/CodeGen.h" @@ -276,6 +277,10 @@ // 4 for ELF32, 8 for ELF64. int Wordsize; + + // Target triple, inferred from program name or defaulted to LLVM + // default target. + llvm::Triple TargetTriple; }; // The only instance of Configuration struct. Index: ELF/Driver.h =================================================================== --- ELF/Driver.h +++ ELF/Driver.h @@ -31,7 +31,9 @@ void addLibrary(StringRef Name); private: + void setDefaultTargetTriple(StringRef argv0); void readConfigs(llvm::opt::InputArgList &Args); + void appendDefaultSearchPaths(); void createFiles(llvm::opt::InputArgList &Args); void inferMachineType(); template void link(llvm::opt::InputArgList &Args); Index: ELF/Driver.cpp =================================================================== --- ELF/Driver.cpp +++ ELF/Driver.cpp @@ -365,6 +365,23 @@ error("unknown -z value: " + StringRef(Arg->getValue())); } +void LinkerDriver::appendDefaultSearchPaths() { + if (Config->TargetTriple.isOSNetBSD()) { + // NetBSD driver relies on the linker knowing the default search paths. + // Please keep this in sync with clang/lib/Driver/ToolChains/NetBSD.cpp + // (NetBSD::NetBSD constructor) + switch (Config->EMachine) { + case EM_386: + Config->SearchPaths.push_back("=/usr/lib/i386"); + break; + case EM_X86_64: + break; + // TODO: support non-x86 architectures + } + Config->SearchPaths.push_back("=/usr/lib"); + } +} + void LinkerDriver::main(ArrayRef ArgsArr) { ELFOptTable Parser; opt::InputArgList Args = Parser.parse(ArgsArr.slice(1)); @@ -410,8 +427,10 @@ } } + setDefaultTargetTriple(ArgsArr[0]); readConfigs(Args); checkZOptions(Args); + appendDefaultSearchPaths(); // The behavior of -v or --version is a bit strange, but this is // needed for compatibility with GNU linkers. @@ -746,6 +765,21 @@ error(Msg + ": " + StringRef(Err).trim()); } +void LinkerDriver::setDefaultTargetTriple(StringRef argv0) { + // Start with a default initial triple + Config->TargetTriple = llvm::Triple(getDefaultTargetTriple()); + + // Try to override triple with program name prefix + std::string ProgName = llvm::sys::path::stem(argv0); + size_t LastComponent = ProgName.rfind('-'); + if (LastComponent != std::string::npos) { + std::string Prefix = ProgName.substr(0, LastComponent); + std::string IgnoredError; + // TODO: verify the triple somehow? + Config->TargetTriple = llvm::Triple(Prefix); + } +} + // Initializes Config members by the command line options. void LinkerDriver::readConfigs(opt::InputArgList &Args) { errorHandler().Verbose = Args.hasArg(OPT_verbose);