[llvm-bugs] [Bug 34053] New: LLD doesn't handle --dynamic-list correctly for shared libraries
via llvm-bugs
llvm-bugs at lists.llvm.org
Thu Aug 3 13:37:20 PDT 2017
https://bugs.llvm.org/show_bug.cgi?id=34053
Bug ID: 34053
Summary: LLD doesn't handle --dynamic-list correctly for shared
libraries
Product: lld
Version: unspecified
Hardware: PC
OS: All
Status: NEW
Severity: enhancement
Priority: P
Component: ELF
Assignee: unassignedbugs at nondot.org
Reporter: smeenai at fb.com
CC: grimar at accesssoftek.com, llvm-bugs at lists.llvm.org,
rafael.espindola at gmail.com, ruiu at google.com
According to the binutils documentation [1], --dynamic-list on a shared library
should mean that the symbols in the dynamic list are always preemptible. Some
experimentation shows that it also implies that other symbols shouldn't be
preemptible. An example, for clarity.
% cat dyn.c
void a() {}
void b() {}
void c() { a(); b(); }
% cat dyn.list
{ a; };
% clang -fPIC -c dyn.c
% ld.bfd -shared --dynamic-list dyn.list -o libdyn.so dyn.o
% objdump -d libdyn.so
00000000000002d0 <c>:
2d0: 55 push %rbp
2d1: 48 89 e5 mov %rsp,%rbp
2d4: e8 c7 ff ff ff callq 2a0 <a at plt>
2d9: e8 e2 ff ff ff callq 2c0 <b>
2de: 5d pop %rbp
2df: c3 retq
gold exhibits the same behavior. LLD, on the other hand, still calls both a and
b through the PLT.
The LLD source [2] appears to treat dynamic lists as equivalent to version
scripts with an implicit local: * at the end, except I can't see where it's
injecting the implicit local: *. Even if it were, however, I don't think that's
correct; the dynamic list for shared libraries only controls preemption,
whereas the version script controls visibility. For example, the dynamic symbol
table for libdyn.so linked with BFD above contains all three of a, b, and c,
even though only a was in the dynamic list. Similarly, I can pass BFD a version
script which explicitly marks b as global, but the call to b still won't be
preemptible.
Some further experimentation shows that when both -Bsymbolic and --dynamic-list
are specificied, BFD gives the last option precedence, whereas gold always
gives --dynamic-list precedence. I personally prefer gold's behavior here.
Additionally, gold appears to limit this behavior to --dynamic-list.
--export-dynamic-symbol doesn't change preemptibility, only dynamic symbol
table population. (BFD doesn't have the --export-dynamic-symbol option, so
that's not a consideration for it.)
[1] https://sourceware.org/binutils/docs/ld/Options.html
[2]
https://reviews.llvm.org/diffusion/L/browse/lld/trunk/ELF/Driver.cpp;309980$755-757
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170803/38e726a6/attachment.html>
More information about the llvm-bugs
mailing list