elf obj load: skip zero-sized sections early

Jeff Roberson jroberson at jroberson.net
Sun Jul 11 21:40:16 UTC 2010


On Sun, 11 Jul 2010, Andriy Gapon wrote:

>
> [oops, sorry, this is not a dup - corrected some omissions/mistakes]
>
> on 11/07/2010 14:54 Andriy Gapon said the following:
>> For completeness, here is a patch that simply drops the inline assembly and the
>> comment about it, and GCC-generated assembly and its diff:
>> http://people.freebsd.org/~avg/dpcpu/pcpu.new.patch
>> http://people.freebsd.org/~avg/dpcpu/dpcpu.new.s
>> http://people.freebsd.org/~avg/dpcpu/dpcpu.new.diff
>>
>> As was speculated above, the only thing really changed is section alignment
>> (from 128 to 4).
>
> After making the above analysis I wondered why we require set_pcpu section
> alignment at all.  After all, it's not used as loaded, data from the section
> gets copied into special per-cpu memory areas.  So, logically, it's those areas
> that need to be aligned, not the section.

I appreciate your analysis but I don't understand the motivation for 
changing working code.

Jeff

>
> svn log and google quickly pointed me to this excellent analysis and explanation
> by bz (thanks again!):
> http://people.freebsd.org/~bz/20090809-02-pcpu-start-align-fix.diff
>
> Summary: this alignment is needed to work around a bug in GNU binutils ld for
> __start_SECNAME placement.
>
> As explained by bz, ld internally generates an equivalent of the following
> linker script:
> ...
> __start_pcpu_set = ALIGN(NN);
> pcpu_set : {
> ...
> }
> __stop_pcpu_set = .;
>
> Where NN is an alignment of the first _input_ pcpu_set section found in
> whichever .o file happens to be first.  Not the resulting alignment of pcpu_set
> _output_ section.
> Alignment requirement of input sections is based on largest alignment
> requirement of section's members.  So if section is empty then the required
> alignment is 1.  Alignment of output section, if not explicitly overridden e.g.
> via linker script, is the largest alignment of the corresponding input sections.
>
> I think that the problem can be fixed by making ld define __start_SECNAME like
> follows:
> ...
> pcpu_set : {
> __start_pcpu_set = ABSOLUTE(.);
> ...
> }
> __stop_pcpu_set = .;
>
> This way __start_SECNAME would always point to the actual start of the output
> section.
>
> Here's a patch that implements the idea:
> http://people.freebsd.org/~avg/dpcpu/ld.start_sec-alignment.patch
>
> This is similar to what was done upstream:
> http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/ldlang.c.diff?r1=1.306&r2=1.307&cvsroot=src&f=h
> The code is quite different there, and approach is somewhat different, but the
> idea is the same - place __start_SECNAME inside the section, not outside it.
>
> My testing shows the expected results.
> What do you think?
>
> -- 
> Andriy Gapon
>


More information about the freebsd-hackers mailing list