From e315edd74790d99f2abed6090f707850de984ecb Mon Sep 17 00:00:00 2001 From: Shankar Easwaran Date: Fri, 6 Feb 2015 04:15:00 +0000 Subject: [PATCH] [ELF] Fix -nostdlib option. Only search library directories explicitly specified on the command line. Library directories specified in linker scripts (including linker scripts specified on the command line) are ignored. llvm-svn: 228375 --- lld/include/lld/ReaderWriter/ELFLinkingContext.h | 5 +++++ lld/lib/Driver/GnuLdDriver.cpp | 10 ++++++++-- lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp | 4 ++-- lld/unittests/DriverTests/GnuLdDriverTest.cpp | 13 ++++++++++++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/lld/include/lld/ReaderWriter/ELFLinkingContext.h b/lld/include/lld/ReaderWriter/ELFLinkingContext.h index e544bcd7aa64..cb6a2e384ace 100644 --- a/lld/include/lld/ReaderWriter/ELFLinkingContext.h +++ b/lld/include/lld/ReaderWriter/ELFLinkingContext.h @@ -303,6 +303,10 @@ public: _scripts.push_back(std::move(script)); } + /// \brief nostdlib support. + bool nostdlib() const { return _nostdlib; } + void setNoStdLib(bool nostdlib) { _nostdlib = nostdlib; } + private: ELFLinkingContext() LLVM_DELETED_FUNCTION; @@ -328,6 +332,7 @@ protected: bool _mergeRODataToTextSegment; bool _demangle; bool _alignSegments; + bool _nostdlib; llvm::Optional _maxPageSize; OutputMagic _outputMagic; diff --git a/lld/lib/Driver/GnuLdDriver.cpp b/lld/lib/Driver/GnuLdDriver.cpp index 7e443fcd3f94..b0e35f87bc0c 100644 --- a/lld/lib/Driver/GnuLdDriver.cpp +++ b/lld/lib/Driver/GnuLdDriver.cpp @@ -293,7 +293,8 @@ GnuLdDriver::evalLinkerScript(ELFLinkingContext &ctx, ctx.getNodes().push_back(llvm::make_unique(groupSize)); } if (auto *searchDir = dyn_cast(c)) - ctx.addSearchPath(searchDir->getSearchPath()); + if (!ctx.nostdlib()) + ctx.addSearchPath(searchDir->getSearchPath()); if (auto *entry = dyn_cast(c)) ctx.setEntrySymbolName(entry->getEntryName()); if (auto *output = dyn_cast(c)) @@ -386,6 +387,8 @@ bool GnuLdDriver::parse(int argc, const char *argv[], bool _outputOptionSet = false; + bool hasNoStdLib = false; + // Ignore unknown arguments. for (auto unknownArg : parsedArgs->filtered(OPT_UNKNOWN)) diag << "warning: ignoring unknown argument: " @@ -400,9 +403,12 @@ bool GnuLdDriver::parse(int argc, const char *argv[], ctx->addSearchPath(libDir->getValue()); // Add the default search directory specific to the target. - if (!parsedArgs->hasArg(OPT_nostdlib)) + if (!(hasNoStdLib = parsedArgs->hasArg(OPT_nostdlib))) ctx->addDefaultSearchDirs(baseTriple); + // -nostdlib support. + ctx->setNoStdLib(hasNoStdLib); + // Handle --demangle option(For compatibility) if (parsedArgs->getLastArg(OPT_demangle)) ctx->setDemangleSymbols(true); diff --git a/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp b/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp index db601430fc04..e45b17fbbd78 100644 --- a/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp +++ b/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp @@ -61,8 +61,8 @@ ELFLinkingContext::ELFLinkingContext( _mergeCommonStrings(false), _useShlibUndefines(true), _dynamicLinkerArg(false), _noAllowDynamicLibraries(false), _mergeRODataToTextSegment(true), _demangle(true), _alignSegments(true), - _outputMagic(OutputMagic::DEFAULT), _initFunction("_init"), - _finiFunction("_fini"), _sysrootPath("") {} + _nostdlib(false), _outputMagic(OutputMagic::DEFAULT), + _initFunction("_init"), _finiFunction("_fini"), _sysrootPath("") {} void ELFLinkingContext::addPasses(PassManager &pm) { pm.add(std::unique_ptr(new elf::OrderPass())); diff --git a/lld/unittests/DriverTests/GnuLdDriverTest.cpp b/lld/unittests/DriverTests/GnuLdDriverTest.cpp index deca45c522f4..7918edb4695f 100644 --- a/lld/unittests/DriverTests/GnuLdDriverTest.cpp +++ b/lld/unittests/DriverTests/GnuLdDriverTest.cpp @@ -29,9 +29,12 @@ protected: class LinkerScriptTest : public testing::Test { protected: - void parse(StringRef script) { + virtual void SetUp() { llvm::Triple triple(llvm::sys::getDefaultTargetTriple()); _ctx = std::move(GnuLdDriver::createELFLinkingContext(triple)); + } + + void parse(StringRef script) { std::unique_ptr mb = MemoryBuffer::getMemBuffer( script, "foo.so"); std::string s; @@ -214,3 +217,11 @@ TEST_F(LinkerScriptTest, Output) { parse("OUTPUT(\"/path/to/output\")"); EXPECT_EQ("/path/to/output", _ctx->outputPath()); } + +// Test that search paths are ignored when nostdlib is set. +TEST_F(LinkerScriptTest, IgnoreSearchDirNoStdLib) { + _ctx->setNoStdLib(true); + parse("SEARCH_DIR(\"/foo/bar\")"); + std::vector paths = _ctx->getSearchPaths(); + EXPECT_EQ((size_t)0, paths.size()); +}