Support dead-stripping in ELF objects

Michael Spencer bigcheesegs at gmail.com
Fri Apr 5 16:58:06 PDT 2013


On Tue, Apr 2, 2013 at 8:31 PM, Shankar Easwaran <shankare at codeaurora.org>wrote:

> Section flags:
>> * SHF_VALID_SIZE
>>    * There shall be a symbol with st_value of 0.
>>
> Is this to deal with weak symbols ?


No, it's so the entire section is covered.


>
>     * For each symbol, st_value + st_size shall be the st_value of another
>> symbol, or sh_size (the end of the section).
>>
> This wouldnot handle the case for hand coded assembly files, where the
> user forgets about specifying the size of the function
> (Not  a requirement though). This also doesnot handle the case when
> symbols in the section are aligned differently.


Hence why we have a special flag for it.


>
>     * For each symbol, the range [st_value, st_value + st_size) shall be
>> non-overlapping.
>>
> What if the symbol is 0 sized ? the next symbol and the current symbol
> will be overlapping right ?


It's a half open range. I put wording in for this specific case, but
removed it because it's already handled by being half open.


> * SHF_SUBSECTION_VIA_SYMBOLS - SHF_VALID_SIZE must also be set.
>>    * The range [st_value, st_value + st_size) of each symbol in the
>> section
>> may be moved to a different relative location.
>>
> Isnt this same as the functionality that you get by using
> -ffunction-sections/-fdata-**sections ?


Yes. But without the large overhead from all the extra sections.


>
>
>> * SHF_DEADSTRIP - This section may be removed if it is dead. If
>> SHF_SUBSECTION_VIA_SYMBOLS is also set, symbols and their data may be
>> removed if dead.
>>
> When will this be used ?
>
> I think this is duplicate of what -ffunction-sections/-fdata-**sections
> will provide. You can dead strip a section
> and the symbols contained in it, since the compiler has created a seperate
> section for that.


It's an alternative version of it that is more expressive and safer.


>
>
>>    This is separate because the assembler may have preformed relaxation
>> within a section, but you would still like the entire section to be
>> removed
>> if it is not referenced. This also provides a way to limit the effect of
>> --gc-sections without hard coding the names of sections not to remove
>> (such
>> as .init and .fini).
>>
>> Symbol flags (which we'll have to find a place to embed, probably st_other
>> which has 6 free bits):
>> * STF_NO_DEADSTRIP - Never remove this symbol or symbols it references
>> even
>> if it is in a SHF_SUBSECTION_VIA_SYMBOLS or SHF_DEADSTRIP section
>>
> The linker will save space only if SHF_SUBSECTION_VIA_SYMBOLS is set,
> which otherwise doesnot get any benefit right ?
>
> Shankar Easwaran


By default the linker will only be allowed to remove SHF_DEAD_STRIP
{sub,}sections unless you specify --gc-sections. If an entire section is
dead, it can be removed. It doesn't have to be SHF_SUBSECTION_VIA_SYMBOLS.

- Michael Spencer
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130405/ed5d7a98/attachment.html>


More information about the llvm-commits mailing list