[lld] r240620 - COFF: Handle undefined symbols starting with __imp_ in a special way.

Rui Ueyama ruiu at google.com
Wed Jun 24 19:40:58 PDT 2015


Ah, you're right. I tried to copy the existing behavior of the old LLD but
I missed that point (and this feature didn't have test). Will fix.

On Wed, Jun 24, 2015 at 7:39 PM, Peter Collingbourne <peter at pcc.me.uk>
wrote:

> On Thu, Jun 25, 2015 at 02:21:44AM -0000, Rui Ueyama wrote:
> > Author: ruiu
> > Date: Wed Jun 24 21:21:44 2015
> > New Revision: 240620
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=240620&view=rev
> > Log:
> > COFF: Handle undefined symbols starting with __imp_ in a special way.
> >
> > MSVC linker is able to link an object file created from the following
> code.
> > Note that __imp_hello is not defined anywhere.
> >
> >   void hello() { printf("Hello\n"); }
> >   extern void (*__imp_hello)();
> >   int main() { __imp_hello(); }
> >
> > Function symbols exported from DLLs are automatically mangled by
> appending
> > __imp_ prefix, so they have two names (original one and with the prefix).
> > This "feature" seems to simulate that behavior even for non-DLL symbols.
> >
> > This is in my opnion very odd feature. Even MSVC linker warns if you use
> this.
> > I'm adding that anyway for the sake of compatibiltiy.
> >
> > Added:
> >     lld/trunk/test/COFF/locally-imported.test
> > Modified:
> >     lld/trunk/COFF/SymbolTable.cpp
> >
> > Modified: lld/trunk/COFF/SymbolTable.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.cpp?rev=240620&r1=240619&r2=240620&view=diff
> >
> ==============================================================================
> > --- lld/trunk/COFF/SymbolTable.cpp (original)
> > +++ lld/trunk/COFF/SymbolTable.cpp Wed Jun 24 21:21:44 2015
> > @@ -70,17 +70,26 @@ bool SymbolTable::reportRemainingUndefin
> >      auto *Undef = dyn_cast<Undefined>(Sym->Body);
> >      if (!Undef)
> >        continue;
> > +    StringRef Name = Undef->getName();
> >      if (SymbolBody *Alias = Undef->getWeakAlias()) {
> >        Sym->Body = Alias->getReplacement();
> >        if (!isa<Defined>(Sym->Body)) {
> >          // Aliases are yet another symbols pointed by other symbols
> >          // that could also remain undefined.
> > -        llvm::errs() << "undefined symbol: " << Undef->getName() <<
> "\n";
> > +        llvm::errs() << "undefined symbol: " << Name << "\n";
> >          Ret = true;
> >        }
> >        continue;
> >      }
> > -    llvm::errs() << "undefined symbol: " << Undef->getName() << "\n";
> > +    // If we can resolve a symbol by removing __imp_ prefix, do that.
> > +    // This odd rule is for compatibility with MSVC linker.
> > +    if (Name.startswith("__imp_")) {
> > +      if (Defined *Imp = find(Name.substr(strlen("__imp_")))) {
> > +        Sym->Body = Imp;
>
> Is it correct to simply strip the prefix? Don't we need to introduce a
> level
> of indirection as if we were creating an import table entry?
>
> Thanks,
> --
> Peter
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150624/a2b27a12/attachment.html>


More information about the llvm-commits mailing list