[lld] r228375 - [ELF] Fix -nostdlib option.
Shankar Easwaran
shankare at codeaurora.org
Thu Feb 5 20:50:16 PST 2015
Yeah, this can be done. Will do in next set of commits.
Thanks for reviewing.
Shankar Easwaran
On 2/5/2015 10:42 PM, Rui Ueyama wrote:
> I think there's a better way to do the this kind of thing.
>
> Linker scripts are now parsed in the driver, so if some information
> produced by the driver is consumed only by linker scripts, that information
> doesn't have to be propagated to the linking context object.
>
> You added two public member functions, ELFLinkingContext::nostdlib and
> ELFLinkingContext::setNoStdLib (btw the inconsistency in camel case made me
> a bit unconfortable), but we actually don't need them. We can instead just
> add a local variable to the Driver, which holds whether -nostdlib is given
> or not, and pass that variable to evalLinkerScript.
>
> On Thu, Feb 5, 2015 at 8:15 PM, Shankar Easwaran <shankare at codeaurora.org>
> wrote:
>
>> Author: shankare
>> Date: Thu Feb 5 22:15:00 2015
>> New Revision: 228375
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=228375&view=rev
>> Log:
>> [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.
>>
>> Modified:
>> lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
>> lld/trunk/lib/Driver/GnuLdDriver.cpp
>> lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp
>> lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp
>>
>> Modified: lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=228375&r1=228374&r2=228375&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)
>> +++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Thu Feb 5
>> 22:15:00 2015
>> @@ -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<uint64_t> _maxPageSize;
>>
>> OutputMagic _outputMagic;
>>
>> Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=228375&r1=228374&r2=228375&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)
>> +++ lld/trunk/lib/Driver/GnuLdDriver.cpp Thu Feb 5 22:15:00 2015
>> @@ -293,7 +293,8 @@ GnuLdDriver::evalLinkerScript(ELFLinking
>> ctx.getNodes().push_back(llvm::make_unique<GroupEnd>(groupSize));
>> }
>> if (auto *searchDir = dyn_cast<script::SearchDir>(c))
>> - ctx.addSearchPath(searchDir->getSearchPath());
>> + if (!ctx.nostdlib())
>> + ctx.addSearchPath(searchDir->getSearchPath());
>> if (auto *entry = dyn_cast<script::Entry>(c))
>> ctx.setEntrySymbolName(entry->getEntryName());
>> if (auto *output = dyn_cast<script::Output>(c))
>> @@ -386,6 +387,8 @@ bool GnuLdDriver::parse(int argc, const
>>
>> 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
>> 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);
>>
>> Modified: lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp?rev=228375&r1=228374&r2=228375&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp (original)
>> +++ lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp Thu Feb 5
>> 22:15:00 2015
>> @@ -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<Pass>(new elf::OrderPass()));
>>
>> Modified: lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp?rev=228375&r1=228374&r2=228375&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp (original)
>> +++ lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp Thu Feb 5
>> 22:15:00 2015
>> @@ -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<MemoryBuffer> 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<StringRef> paths = _ctx->getSearchPaths();
>> + EXPECT_EQ((size_t)0, paths.size());
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation
More information about the llvm-commits
mailing list