[RFC] SHF_GNU_RETAIN ELF Section Flag

Jozef Lawrynowicz jozef.l@mittosystems.com
Tue Sep 15 13:29:55 GMT 2020


On Tue, Sep 15, 2020 at 02:55:05PM +0200, Florian Weimer wrote:
> * Carlos O'Donell:
> 
> > On 9/15/20 8:37 AM, Florian Weimer via Gnu-gabi wrote:
> >> * Jozef Lawrynowicz:
> >> 
> >>> On Tue, Sep 15, 2020 at 02:09:22PM +0200, Florian Weimer wrote:
> >>>> * Jozef Lawrynowicz:
> >>>>
> >>>>> I'd like to propose a new ELF section flag, SHF_GNU_RETAIN, for addition
> >>>>> to the GNU gABI.
> >>>>>
> >>>>> This flag instructs the linker to "retain" the section in the output
> >>>>> file, even if garbage collection would remove it because it appears
> >>>>> unused.
> >>>>
> >>>> How does this flag interaction with libraries (.a files)?
> >>>
> >>> If a section in a library has SHF_GNU_RETAIN set, and that library gets
> >>> searched by the linker for some undefined symbol, then the
> >>> SHF_GNU_RETAIN section will also be pulled into the program, and
> >>> retained in the linked output file.
> >> 
> >> Sorry, that's not quite what I meant.  What happens if the .o file with
> >> SHF_GNU_RETAIN in an .a library is not otherwise referenced and thus
> >> never loaded by the link editor?  How would the link editor realize that
> >> it is even there?
> >
> > Why would it be loaded?
> 
> Hypothetically: Because the ranlib section tells the link editor to load
> it (so more specification updates are needed).
> 

An SHF_GNU_RETAIN section would only be kept if it's containing object
was loaded in the first place, and the section was therefore considered for
garbage collection. So no, SHF_GNU_RETAIN is not intended to be used to
force inclusion of sections which the linker would not have otherwise
seen.
SHF_GNU_RETAIN can be thought of to essentially "turn off" garbage
collection for that section, rather than change the fundamental linking
behavior for that section or containing object.

Carlos' ammendment to the definition is accurate:

> SHF_GNU_RETAIN
>   When an object file containing such a marked section is included in
>   the link, the section should not be garbage collected by the linker,
>   even if it appears unused.

> > Why does the link editor need to detect the presence of such a file?
> 
> To make SHF_GNU_RETAIN work with libraries.
> 
> I think without that, the same effect can be had today with
> SHF_GROUP/SHT_GROUP, perhaps with an assembler-only change to implement
> the .retain pseudo.
> 

Perhaps, but without making any further extensions, wouldn't the
assembler need to know of a section which will definitiley be kept in
the output file? Only the linker can truly know this, by looking at the
entry point (when there is one).

A new bit in GRP_MASKOS could define that sections in a group with this
flag must always be kept, but that seems like a more round about way of
using a new section flag.

Thanks,
Jozef


More information about the Gnu-gabi mailing list