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

Shankar Easwaran shankare at codeaurora.org
Mon Dec 8 11:57:16 PST 2014


On 12/8/2014 1:22 PM, Simon Atanasyan wrote:
> 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.
The dynamic loader handles only one entry for DT_INIT. If there is more 
than one init option, we could convert this as an .init_array instead ?

If that doesnot work, we can come up with a .init_array option but I am 
not sure about how will you handle priority with init_array's ? Do you 
set linker defined init/fini symbols the last in priority ?

Shankar Easwaran

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-dev mailing list