[PATCH] D26033: [ELF] Resolve undefined symbols from archives when linking shared objects
Eugene Leviant via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 28 02:15:01 PDT 2016
Here is how I stepped on a problem (simplified):
clang a.out.o liba.so libb.so -o executable // got link error here
when used lld, both gold and ld succeeded
liba,so is built this way:
clang a.o libb.so libstatic.a -o liba.so
I wonder is this some sort of malformed or undocumented behavior of ld/gold?
2016-10-27 21:16 GMT+03:00 Rui Ueyama <ruiu at google.com>:
> On Thu, Oct 27, 2016 at 11:08 AM, Rafael EspĂndola
> <rafael.espindola at gmail.com> wrote:
>>
>> This is inconsistent with how lld looks at shared libraries.
>>
>> We always use --allow-shlib-undefined, which basically means that we
>> only look at share libraries to see what they provide and trust that
>> they will have all their dependencies at run time.
>>
>> If we absolutely must, we should probably just implement a
>> --no-allow-shlib-undefined. But I would like a very strong
>> justification before we do that.
>
>
> I agreed. We intentionally do not try to resolve symbols in DSOs because it
> doesn't make much sense. Such undefined symbols may be resolved not at
> link-time but at runtime. In scanShlibUndefined, we do not resolves symbols,
> but just mark symbols as ExportDynamic.
>
>>
>>
>> Cheers,
>> Rafael
>>
>> On 27 October 2016 at 11:01, Eugene Leviant <evgeny.leviant at gmail.com>
>> wrote:
>> > evgeny777 created this revision.
>> > evgeny777 added reviewers: ruiu, rafael.
>> > evgeny777 added subscribers: grimar, ikudrin, llvm-commits.
>> > evgeny777 set the repository for this revision to rL LLVM.
>> > evgeny777 added a project: lld.
>> >
>> > When linking DSO lld doesn't resolve symbols from input DSOs in case
>> > those symbols are lazy. Below is an example:
>> >
>> > input.so - has undefined symbol 'print'
>> > libprint.a - defines 'print'
>> >
>> > ld.lld -shared -o output.so input.so libprint.a
>> >
>> > Even though libprint.a has definition of 'print', output.so will have it
>> > undefined.
>> > Later when you link application with output.so, you'll also have to
>> > provide libprint.a
>> >
>> > This patch fixes it.
>> >
>> >
>> > Repository:
>> > rL LLVM
>> >
>> > https://reviews.llvm.org/D26033
>> >
>> > Files:
>> > ELF/SymbolTable.cpp
>> > test/ELF/Inputs/shared4.s
>> > test/ELF/shared-lazy.s
>> >
>> >
>> > Index: test/ELF/shared-lazy.s
>> > ===================================================================
>> > --- test/ELF/shared-lazy.s
>> > +++ test/ELF/shared-lazy.s
>> > @@ -0,0 +1,10 @@
>> > +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
>> > +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux
>> > %p/Inputs/archive.s -o %t2.o
>> > +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux
>> > %p/Inputs/shared4.s -o %t3.o
>> > +# RUN: llvm-ar rcs %t2.a %t2.o
>> > +# RUN: ld.lld -shared %t3.o -o %t3.so
>> > +# RUN: ld.lld -shared %t.o %t2.a %t3.so -o %t.so
>> > +# RUN: llvm-objdump -t %t.so | FileCheck --check-prefix=DEFINED %s
>> > +
>> > +# DEFINED: _start
>> > +call _entry at plt
>> > Index: test/ELF/Inputs/shared4.s
>> > ===================================================================
>> > --- test/ELF/Inputs/shared4.s
>> > +++ test/ELF/Inputs/shared4.s
>> > @@ -0,0 +1,3 @@
>> > +.globl _shared
>> > +_shared:
>> > + call _start at plt
>> > Index: ELF/SymbolTable.cpp
>> > ===================================================================
>> > --- ELF/SymbolTable.cpp
>> > +++ ELF/SymbolTable.cpp
>> > @@ -549,9 +549,12 @@
>> > template <class ELFT> void SymbolTable<ELFT>::scanShlibUndefined() {
>> > for (SharedFile<ELFT> *File : SharedFiles)
>> > for (StringRef U : File->getUndefinedSymbols())
>> > - if (SymbolBody *Sym = find(U))
>> > + if (SymbolBody *Sym = find(U)) {
>> > if (Sym->isDefined())
>> > Sym->symbol()->ExportDynamic = true;
>> > + else if (Sym->isLazy())
>> > + addUndefined(U);
>> > + }
>> > }
>> >
>> > // This function processes --export-dynamic-symbol and --dynamic-list.
>> >
>> >
>
>
More information about the llvm-commits
mailing list