[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