[LLVMdev] [lld] Handling multiple -init/-fini command line options

Rui Ueyama ruiu at google.com
Sun Dec 7 22:35:15 PST 2014


I don't know whether or not it's intended, but it seems like a subtle but
unnecessary incompatibility. I'd vote for making it compatible with GNU
unless there's a real reason to not do so.

On Mon, Dec 8, 2014 at 3:22 PM, Simon Atanasyan <simon at atanasyan.com> wrote:

> Hi,
>
> The LLD linker in gnu flavor mode accepts multiple -init/-fini command
> line options. For _all_ symbols specified by these options the linker
> creates appropriate entries in the .init_array/.fini_array sections.
> But it looks like LD and Gold linkers do not support this feature and
> take in account only the last -init/-fini options.
>
> % cat foo.c
> int a = 0;
> void foo() { a += 1; }
> void bar() { a += 2; }
>
> % cat main.c
> extern int a;
> int printf(const char *, ...);
> int main() { printf("a: %d\n", a); }
>
> % gcc -fPIC -shared -o libfoo.so -Wl,-init,foo -Wl,-init,bar foo.c
> % gcc main.c -L. -lfoo -Wl,-rpath,.
> % ./a.out
> 2
>
> % gcc -fPIC -shared -o libfoo.so -Wl,-init,bar -Wl,-init,foo foo.c
> % ./a.out
> 1
>
> What is the reason of this incompatibility? The question is caused by
> attempt to support DT_INIT/DT_FINI dynamic table tags. The table can
> contain no more than one DT_INIT/DT_FINI tags. The LD and Gold linker
> look up either default symbols (_init/_fini) or symbols specified by
> the -init/-fini options and put their values to the tags.
>
> --
> Simon Atanasyan
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141208/2ddf8d3c/attachment.html>


More information about the llvm-dev mailing list