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

Simon Atanasyan simon at atanasyan.com
Mon Dec 8 11:22:57 PST 2014


On Mon, Dec 8, 2014 at 8:39 PM, Shankar Easwaran
<shankare at codeaurora.org> wrote:
> On 12/8/2014 11:09 AM, Joerg Sonnenberger wrote:
>>
>> On Mon, Dec 08, 2014 at 10:21:49AM -0600, Shankar Easwaran wrote:
>>>
>>> The DT_INIT/DT_FINI correspond to one initializer function,where as
>>> DT_INIT_ARRAY/DT_FINI_ARRAY is used when there is more than one
>>> initalizer function/finalizer function respectively.
>>
>> This is not true. The difference is that the DT_INIT / DT_FINI function
>> is responsible for calling into the .init / .fini block and for
>> DT_INIT_ARRAY / DT_FINI_ARRAY, the block is explicitly defined as a
>> list of pointers and it is the responsibility of either the CRT logic or
>> the dynamic linker to call them.
>>
>> That said, I don't think more than one DT_INIT / DT_FINI entry should be
>> allowed as the latter entry will overwrite the earlier ones.
>
> Thanks Joerg, The snip of code that appears to run the init/fini was easily
> browseable with musl.
>
> http://git.musl-libc.org/cgit/musl/tree/src/ldso/dynlink.c (function:
> do_init_fini).
>
> That said, all of the code is essentially under NO_LEGACY_INITFINI, is the
> linker responsible to convert DT_INIT to DT_INITARRAY's ?
>
> If so, I think more than one init/fini option should be converted to
> DT_INIT_ARRAY (or) DT_FINI_ARRAY respectively ?

By the way, gnu linker support both DT_INIT and DT_INIT_ARRAY tags at
the same time. For example, if input objects contain .init_array
section and _init symbol, gnu linker emits both DT_INIT and
DT_INIT_ARRAY tags. And I still do not see any reason to assign more
complicated semantic to the -init/-fini options and introduce
incompatibility with gnu linker.

-- 
Simon Atanasyan



More information about the llvm-dev mailing list