[lld] r195307 - [LinkingContext] Limit shared library undefined atoms to be added.

Nick Kledzik kledzik at apple.com
Thu Nov 21 09:30:10 PST 2013


On Nov 20, 2013, at 7:50 PM, Shankar Easwaran <shankare at codeaurora.org> wrote:

> Author: shankare
> Date: Wed Nov 20 21:50:59 2013
> New Revision: 195307
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=195307&view=rev
> Log:
> [LinkingContext] Limit shared library undefined atoms to be added.
> 
> This adds functionality to limit shared library undefined atoms to be added
> only once by the Resolver.
> 
> Dynamic libraries may be processed more than once if they exist within a
> Group.
> 
> Also adds a test to verify the change.
> 
> Added:
>    lld/trunk/test/elf/X86_64/Inputs/group/libfn.so   (with props)
>    lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test
> Modified:
>    lld/trunk/include/lld/Core/LinkingContext.h
>    lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
>    lld/trunk/lib/Core/Resolver.cpp
> 
> Modified: lld/trunk/include/lld/Core/LinkingContext.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/LinkingContext.h?rev=195307&r1=195306&r2=195307&view=diff
> ==============================================================================
> --- lld/trunk/include/lld/Core/LinkingContext.h (original)
> +++ lld/trunk/include/lld/Core/LinkingContext.h Wed Nov 20 21:50:59 2013
> @@ -34,6 +34,7 @@ class File;
> class Writer;
> class InputGraph;
> class InputElement;
> +class SharedLibraryFile;
> 
> /// \brief The LinkingContext class encapsulates "what and how" to link.
> ///
> @@ -163,6 +164,11 @@ public:
>   /// to be an error.
>   bool allowShlibUndefines() const { return _allowShlibUndefines; }
> 
> +  /// Add undefined symbols from shared libraries ?
> +  virtual bool addUndefinedAtomsFromSharedLibrary(const SharedLibraryFile *) {
> +    return true;
> +  }
> +
FYI, MacOSX and iOS use something we call two-level-namespace wherein each imported symbol
is marked with the dylib it was found in at static link time.  At runtime, the loader (dyld) only looks in
that symbol in that dylib.  Therefore, there is no need to check undefined symbols in DSOs (dylibs)
at static link time.  

So, the MachOLinkingContent will be returning false for addUndefinedAtomsFromSharedLibrary(),

-Nick


>   /// If true, core linking will write the path to each input file to stdout
>   /// (i.e. llvm::outs()) as it is used.  This is used to implement the -t
>   /// linker option.
> 
> Modified: lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=195307&r1=195306&r2=195307&view=diff
> ==============================================================================
> --- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)
> +++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Wed Nov 20 21:50:59 2013
> @@ -22,6 +22,7 @@
> #include "llvm/Object/ELF.h"
> #include "llvm/Support/ELF.h"
> 
> +#include <map>
> #include <memory>
> 
> namespace lld {
> @@ -206,6 +207,13 @@ public:
>     return _rpathLinkList;
>   }
> 
> +  virtual bool addUndefinedAtomsFromSharedLibrary(const SharedLibraryFile *s) {
> +    if (_undefinedAtomsFromFile.find(s) != _undefinedAtomsFromFile.end())
> +      return false;
> +    _undefinedAtomsFromFile[s] = true;
> +    return true;
> +  }
> +
> private:
>   ELFLinkingContext() LLVM_DELETED_FUNCTION;
> 
> @@ -240,6 +248,7 @@ protected:
>   StringRef _soname;
>   StringRefVector _rpathList;
>   StringRefVector _rpathLinkList;
> +  std::map<const SharedLibraryFile *, bool> _undefinedAtomsFromFile;
> };
> } // end namespace lld
> 
> 
> Modified: lld/trunk/lib/Core/Resolver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=195307&r1=195306&r2=195307&view=diff
> ==============================================================================
> --- lld/trunk/lib/Core/Resolver.cpp (original)
> +++ lld/trunk/lib/Core/Resolver.cpp Wed Nov 20 21:50:59 2013
> @@ -75,22 +75,27 @@ void Resolver::doFile(const File &file)
> 
> void Resolver::handleFile(const File &file) {
>   uint32_t resolverState = Resolver::StateNoChange;
> +  const SharedLibraryFile *sharedLibraryFile =
> +      llvm::dyn_cast<SharedLibraryFile>(&file);
> +
>   doFile(file);
>   for (const DefinedAtom *atom : file.defined()) {
>     doDefinedAtom(*atom);
>     resolverState |= StateNewDefinedAtoms;
>   }
> -  for (const UndefinedAtom *undefAtom : file.undefined()) {
> -    doUndefinedAtom(*undefAtom);
> -    resolverState |= StateNewUndefinedAtoms;
> -
> -    // If the undefined symbol has an alternative name, try to resolve the
> -    // symbol with the name to give it a second chance. This feature is used for
> -    // COFF "weak external" symbol.
> -    if (!_symbolTable.isDefined(undefAtom->name())) {
> -      if (const UndefinedAtom *fallbackAtom = undefAtom->fallback()) {
> -        doUndefinedAtom(*fallbackAtom);
> -        _symbolTable.addReplacement(undefAtom, fallbackAtom);
> +  if (!sharedLibraryFile ||
> +      _context.addUndefinedAtomsFromSharedLibrary(sharedLibraryFile)) {
> +    for (const UndefinedAtom *undefAtom : file.undefined()) {
> +      doUndefinedAtom(*undefAtom);
> +      resolverState |= StateNewUndefinedAtoms;
> +      // If the undefined symbol has an alternative name, try to resolve the
> +      // symbol with the name to give it a second chance. This feature is used
> +      // for COFF "weak external" symbol.
> +      if (!_symbolTable.isDefined(undefAtom->name())) {
> +        if (const UndefinedAtom *fallbackAtom = undefAtom->fallback()) {
> +          doUndefinedAtom(*fallbackAtom);
> +          _symbolTable.addReplacement(undefAtom, fallbackAtom);
> +        }
>       }
>     }
>   }
> 
> Added: lld/trunk/test/elf/X86_64/Inputs/group/libfn.so
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/Inputs/group/libfn.so?rev=195307&view=auto
> ==============================================================================
> Binary files lld/trunk/test/elf/X86_64/Inputs/group/libfn.so (added) and lld/trunk/test/elf/X86_64/Inputs/group/libfn.so Wed Nov 20 21:50:59 2013 differ
> 
> Propchange: lld/trunk/test/elf/X86_64/Inputs/group/libfn.so
> ------------------------------------------------------------------------------
>    svn:executable = *
> 
> Added: lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test?rev=195307&view=auto
> ==============================================================================
> --- lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test (added)
> +++ lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test Wed Nov 20 21:50:59 2013
> @@ -0,0 +1,10 @@
> +# This tests functionality of --start-group, --end-group with a dynamic library 
> +
> +# Mix dynamic libraries/object files in group
> +RUN: lld -flavor gnu -target x86_64 %p/Inputs/group/1.o --start-group \
> +RUN: %p/Inputs/group/libfn.so %p/Inputs/group/fn2.o \
> +RUN: %p/Inputs/group/fn1.o --end-group -o %t1
> +
> +RUN: llvm-nm %t1 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s
> +
> +RESOLVEDEXTERNAL: {{[0-9a-z]+}} T fn2
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list