diff --git a/tools/gccld/gccld.cpp b/tools/gccld/gccld.cpp index 24c624ece2c..6be78c29e31 100644 --- a/tools/gccld/gccld.cpp +++ b/tools/gccld/gccld.cpp @@ -79,12 +79,20 @@ static inline bool FileExists(const std::string &FN) { // LoadObject - Read the specified "object file", which should not search the // library path to find it. -static inline std::auto_ptr LoadObject(const std::string &FN, +static inline std::auto_ptr LoadObject(std::string FN, std::string &OutErrorMessage) { if (Verbose) std::cerr << "Loading '" << FN << "'\n"; if (!FileExists(FN)) { - OutErrorMessage = "could not find input file '" + FN + "'!"; - return std::auto_ptr(); + // Attempt to load from the LLVM_LIB_SEARCH_PATH directory... if we would + // otherwise fail. This is used to locate objects like crtend.o. + // + char *SearchPath = getenv("LLVM_LIB_SEARCH_PATH"); + if (SearchPath && FileExists(std::string(SearchPath)+"/"+FN)) + FN = std::string(SearchPath)+"/"+FN; + else { + OutErrorMessage = "could not find input file '" + FN + "'!"; + return std::auto_ptr(); + } } std::string ErrorMessage; @@ -224,6 +232,13 @@ static void GetAllUndefinedSymbols(Module *M, static bool LinkLibrary(Module *M, const std::string &LibName, std::string &ErrorMessage) { + std::set UndefinedSymbols; + GetAllUndefinedSymbols(M, UndefinedSymbols); + if (UndefinedSymbols.empty()) { + if (Verbose) std::cerr << " No symbols undefined, don't link library!\n"; + return false; // No need to link anything in! + } + std::vector Objects; bool isArchive; if (LoadLibrary(LibName, Objects, isArchive, ErrorMessage)) return true; @@ -234,9 +249,6 @@ static bool LinkLibrary(Module *M, const std::string &LibName, for (unsigned i = 0; i != Objects.size(); ++i) GetAllDefinedSymbols(Objects[i], DefinedSymbols[i]); - std::set UndefinedSymbols; - GetAllUndefinedSymbols(M, UndefinedSymbols); - bool Linked = true; while (Linked) { // While we are linking in object files, loop. Linked = false;