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

Simon Atanasyan simon at atanasyan.com
Sun Dec 7 22:22:54 PST 2014


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



More information about the llvm-dev mailing list