Index: include/lld/ReaderWriter/ELFLinkingContext.h =================================================================== --- include/lld/ReaderWriter/ELFLinkingContext.h +++ include/lld/ReaderWriter/ELFLinkingContext.h @@ -41,7 +41,7 @@ virtual std::unique_ptr getObjReader(bool) = 0; - virtual std::unique_ptr getDSOReader(bool) = 0; + virtual std::unique_ptr getDSOReader() = 0; virtual std::unique_ptr getWriter() = 0; }; @@ -69,13 +69,6 @@ bool mergeCommonStrings() const { return _mergeCommonStrings; } virtual uint64_t getBaseAddress() const { return _baseAddress; } - /// This controls if undefined atoms need to be created for undefines that are - /// present in a SharedLibrary. If this option is set, undefined atoms are - /// created for every undefined symbol that are present in the dynamic table - /// in the shared library - bool useShlibUndefines() const { return _useShlibUndefines; } - /// @} - /// \brief Does this relocation belong in the dynamic relocation table? /// /// This table is evaluated at loadtime by the dynamic loader and is @@ -150,7 +143,6 @@ void setNoInhibitExec(bool v) { _noInhibitExec = v; } void setIsStaticExecutable(bool v) { _isStaticExecutable = v; } void setMergeCommonStrings(bool v) { _mergeCommonStrings = v; } - void setUseShlibUndefines(bool use) { _useShlibUndefines = use; } void setOutputELFType(uint32_t type) { _outputELFType = type; } void createInternalFiles(std::vector> &) const override; @@ -261,7 +253,6 @@ bool _noInhibitExec; bool _mergeCommonStrings; bool _runLayoutPass; - bool _useShlibUndefines; bool _dynamicLinkerArg; bool _noAllowDynamicLibraries; OutputMagic _outputMagic; Index: include/lld/ReaderWriter/Reader.h =================================================================== --- include/lld/ReaderWriter/Reader.h +++ include/lld/ReaderWriter/Reader.h @@ -125,8 +125,7 @@ void addSupportWindowsResourceFiles(); void addSupportMachOObjects(StringRef archName); void addSupportELFObjects(bool atomizeStrings, TargetHandlerBase *handler); - void addSupportELFDynamicSharedObjects(bool useShlibUndefines, - TargetHandlerBase *handler); + void addSupportELFDynamicSharedObjects(TargetHandlerBase *handler); /// To convert between kind values and names, the registry walks the list /// of registered kind tables. Each table is a zero terminated array of Index: lib/Driver/GnuLdDriver.cpp =================================================================== --- lib/Driver/GnuLdDriver.cpp +++ lib/Driver/GnuLdDriver.cpp @@ -161,22 +161,21 @@ raw_ostream &diagnostics) { BumpPtrAllocator alloc; std::tie(argc, argv) = maybeExpandResponseFiles(argc, argv, alloc); - std::unique_ptr options; - if (!parse(argc, argv, options, diagnostics)) + std::unique_ptr opts; + if (!parse(argc, argv, opts, diagnostics)) return false; - if (!options) + if (!opts) return true; // Register possible input file parsers. - options->registry().addSupportELFObjects(options->mergeCommonStrings(), - options->targetHandler()); - options->registry().addSupportArchives(options->logInputFiles()); - options->registry().addSupportYamlFiles(); - options->registry().addSupportNativeObjects(); - if (options->allowLinkWithDynamicLibraries()) - options->registry().addSupportELFDynamicSharedObjects( - options->useShlibUndefines(), options->targetHandler()); - return link(*options, diagnostics); + opts->registry().addSupportELFObjects(opts->mergeCommonStrings(), + opts->targetHandler()); + opts->registry().addSupportArchives(opts->logInputFiles()); + opts->registry().addSupportYamlFiles(); + opts->registry().addSupportNativeObjects(); + if (opts->allowLinkWithDynamicLibraries()) + opts->registry().addSupportELFDynamicSharedObjects(opts->targetHandler()); + return link(*opts, diagnostics); } static llvm::Optional @@ -310,7 +309,8 @@ case OPT_shared: ctx->setOutputELFType(llvm::ELF::ET_DYN); ctx->setAllowShlibUndefines(true); - ctx->setUseShlibUndefines(false); + ctx->setPrintRemainingUndefines(false); + ctx->setAllowRemainingUndefines(true); break; } } @@ -371,10 +371,6 @@ ctx->setAllowShlibUndefines(true); break; - case OPT_use_shlib_undefs: - ctx->setUseShlibUndefines(true); - break; - case OPT_allow_multiple_definition: ctx->setAllowDuplicates(true); break; Index: lib/Driver/GnuLdOptions.td =================================================================== --- lib/Driver/GnuLdOptions.td +++ lib/Driver/GnuLdOptions.td @@ -186,9 +186,6 @@ HelpText<"Allow undefined symbols from dynamic" " library when creating executables">, Group; -def use_shlib_undefs: Flag<["--"], "use-shlib-undefines">, - HelpText<"Resolve undefined symbols from dynamic libraries">, - Group; def allow_multiple_definition: Flag<["--"], "allow-multiple-definition">, HelpText<"Allow multiple definitions">, Group; Index: lib/ReaderWriter/ELF/DefaultTargetHandler.h =================================================================== --- lib/ReaderWriter/ELF/DefaultTargetHandler.h +++ lib/ReaderWriter/ELF/DefaultTargetHandler.h @@ -37,8 +37,8 @@ return std::unique_ptr(new ELFObjectReader(atomizeStrings)); } - virtual std::unique_ptr getDSOReader(bool useShlibUndefines) { - return std::unique_ptr(new ELFDSOReader(useShlibUndefines)); + virtual std::unique_ptr getDSOReader() { + return std::unique_ptr(new ELFDSOReader()); } virtual std::unique_ptr getWriter() = 0; Index: lib/ReaderWriter/ELF/DynamicFile.h =================================================================== --- lib/ReaderWriter/ELF/DynamicFile.h +++ lib/ReaderWriter/ELF/DynamicFile.h @@ -25,7 +25,7 @@ template class DynamicFile : public SharedLibraryFile { public: static ErrorOr> - create(std::unique_ptr mb, bool useShlibUndefines); + create(std::unique_ptr mb); const atom_collection &defined() const override { return _definedAtoms; @@ -81,8 +81,7 @@ template ErrorOr>> -DynamicFile::create(std::unique_ptr mb, - bool useShlibUndefines) { +DynamicFile::create(std::unique_ptr mb) { std::unique_ptr file(new DynamicFile(mb->getBufferIdentifier())); error_code ec; @@ -111,8 +110,6 @@ continue; if (i->st_shndx == llvm::ELF::SHN_UNDEF) { - if (!useShlibUndefines) - continue; // Create an undefined atom. if (!name->empty()) { auto *newAtom = Index: lib/ReaderWriter/ELF/ELFLinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/ELFLinkingContext.cpp +++ lib/ReaderWriter/ELF/ELFLinkingContext.cpp @@ -57,9 +57,8 @@ _targetHandler(std::move(targetHandler)), _baseAddress(0), _isStaticExecutable(false), _noInhibitExec(false), _mergeCommonStrings(false), _runLayoutPass(true), - _useShlibUndefines(true), _dynamicLinkerArg(false), - _noAllowDynamicLibraries(false), _outputMagic(OutputMagic::DEFAULT), - _sysrootPath("") {} + _dynamicLinkerArg(false), _noAllowDynamicLibraries(false), + _outputMagic(OutputMagic::DEFAULT), _sysrootPath("") {} bool ELFLinkingContext::is64Bits() const { return getTriple().isArch64Bit(); } Index: lib/ReaderWriter/ELF/ELFReader.h =================================================================== --- lib/ReaderWriter/ELF/ELFReader.h +++ lib/ReaderWriter/ELF/ELFReader.h @@ -23,9 +23,8 @@ typedef llvm::ErrorOr> result_type; template - static result_type create(std::unique_ptr mb, - bool useUndefines) { - return lld::elf::DynamicFile::create(std::move(mb), useUndefines); + static result_type create(std::unique_ptr mb) { + return lld::elf::DynamicFile::create(std::move(mb)); } }; @@ -68,7 +67,7 @@ class ELFDSOReader : public Reader { public: - ELFDSOReader(bool useUndefines) : _useUndefines(useUndefines) {} + ELFDSOReader() {} bool canParse(file_magic magic, StringRef, const MemoryBuffer &) const override { @@ -81,16 +80,12 @@ std::size_t maxAlignment = 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF( - llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb), - _useUndefines); + llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb)); if (error_code ec = f.getError()) return ec; result.push_back(std::move(*f)); return error_code::success(); } - -protected: - bool _useUndefines; }; } // namespace elf Index: lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h +++ lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h @@ -20,10 +20,8 @@ typedef llvm::ErrorOr> result_type; template - static result_type create(std::unique_ptr mb, - bool useUndefines) { - return lld::elf::HexagonDynamicFile::create(std::move(mb), - useUndefines); + static result_type create(std::unique_ptr mb) { + return lld::elf::HexagonDynamicFile::create(std::move(mb)); } }; @@ -60,7 +58,7 @@ class HexagonELFDSOReader : public ELFDSOReader { public: - HexagonELFDSOReader(bool useUndefines) : ELFDSOReader(useUndefines) {} + HexagonELFDSOReader() : ELFDSOReader() {} error_code parseFile(std::unique_ptr &mb, const class Registry &, @@ -68,8 +66,7 @@ std::size_t maxAlignment = 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF( - llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb), - _useUndefines); + llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb)); if (error_code ec = f.getError()) return ec; result.push_back(std::move(*f)); Index: lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h +++ lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -122,8 +122,8 @@ return std::unique_ptr(new HexagonELFObjectReader(atomizeStrings)); } - std::unique_ptr getDSOReader(bool useShlibUndefines) override { - return std::unique_ptr(new HexagonELFDSOReader(useShlibUndefines)); + std::unique_ptr getDSOReader() override { + return std::unique_ptr(new HexagonELFDSOReader()); } std::unique_ptr getWriter() override; Index: lib/ReaderWriter/ELF/PPC/PPCELFReader.h =================================================================== --- lib/ReaderWriter/ELF/PPC/PPCELFReader.h +++ lib/ReaderWriter/ELF/PPC/PPCELFReader.h @@ -20,9 +20,8 @@ typedef llvm::ErrorOr> result_type; template - static result_type create(std::unique_ptr mb, - bool useUndefines) { - return lld::elf::PPCDynamicFile::create(std::move(mb), useUndefines); + static result_type create(std::unique_ptr mb) { + return lld::elf::PPCDynamicFile::create(std::move(mb)); } }; @@ -58,7 +57,7 @@ class PPCELFDSOReader : public ELFDSOReader { public: - PPCELFDSOReader(bool useUndefines) : ELFDSOReader(useUndefines) {} + PPCELFDSOReader() : ELFDSOReader() {} virtual error_code parseFile(std::unique_ptr &mb, const class Registry &, @@ -66,8 +65,7 @@ std::size_t maxAlignment = 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF( - llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb), - _useUndefines); + llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb)); if (!f) return f; result.push_back(std::move(*f)); Index: lib/ReaderWriter/ELF/Reader.cpp =================================================================== --- lib/ReaderWriter/ELF/Reader.cpp +++ lib/ReaderWriter/ELF/Reader.cpp @@ -37,10 +37,9 @@ handler->registerRelocationNames(*this); } -void Registry::addSupportELFDynamicSharedObjects(bool useShlibUndefines, - TargetHandlerBase *handler) { +void Registry::addSupportELFDynamicSharedObjects(TargetHandlerBase *handler) { // Tell registry about the ELF dynamic shared library file parser. - add(handler->getDSOReader(useShlibUndefines)); + add(handler->getDSOReader()); } } // end namespace lld Index: lib/ReaderWriter/ELF/TargetHandler.h =================================================================== --- lib/ReaderWriter/ELF/TargetHandler.h +++ lib/ReaderWriter/ELF/TargetHandler.h @@ -68,7 +68,7 @@ virtual std::unique_ptr getObjReader(bool) = 0; /// How does the target deal with reading dynamic libraries. - virtual std::unique_ptr getDSOReader(bool) = 0; + virtual std::unique_ptr getDSOReader() = 0; /// How does the target deal with writing ELF output. virtual std::unique_ptr getWriter() = 0; Index: test/elf/dynamic-undef.test =================================================================== --- test/elf/dynamic-undef.test +++ test/elf/dynamic-undef.test @@ -7,21 +7,16 @@ RUN: not lld -flavor gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ RUN: %p/Inputs/shared.so-x86-64 -o %t -e main 2> %t1 RUN: FileCheck -check-prefix=EXEC %s < %t1 + # This test will pass because of --allow-shlib-undefined RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ RUN: %p/Inputs/shared.so-x86-64 -o %t -e main --allow-shlib-undefined + # Test creation of shared library, this should pass because we are using # shared option and by default, dynamic library wouldn't create undefined atoms # from the input shared library RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ RUN: %p/Inputs/shared.so-x86-64 -o %t -e main -shared -# Test creation of shared library, this should fail because we are using -# shared option setting the options to use the shared library undefines to -# create undefined atoms from the input shared library -RUN: not lld -flavor gnu -target x86_64-linux %p/Inputs/tls.x86-64 \ -RUN: %p/Inputs/shared.so-x86-64 -o %t -e main -shared \ -RUN: --use-shlib-undefines --no-allow-shlib-undefined 2> %t2 -RUN: FileCheck -check-prefix=SHLIB %s < %t2 EXEC: Undefined symbol: {{[-_A-Za-z0-9.\\/:]+}}shared.so-x86-64: puts SHLIB: Undefined symbol: {{[-_A-Za-z0-9.\\/:]+}}shared.so-x86-64: puts