Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Jul 2010 11:15:00 -1000 (HST)
From:      Jeff Roberson <jroberson@jroberson.net>
To:        Andriy Gapon <avg@freebsd.org>
Cc:        Peter Wemm <peter@freebsd.org>, freebsd-hackers@freebsd.org, Jeff Roberson <jeff@freebsd.org>, Konstantin Belousov <kib@freebsd.org>, "Bjoern A. Zeeb" <bzeeb-lists@lists.zabbadoz.net>
Subject:   Re: elf obj load: skip zero-sized sections early
Message-ID:  <alpine.BSF.2.00.1007111112490.1414@desktop>
In-Reply-To: <4C39B7DE.3030100@freebsd.org>
References:  <4C246CD0.3020606@freebsd.org> <20100702082754.S14969@maildrop.int.zabbadoz.net> <4C320E6E.4040007@freebsd.org> <20100705171155.K14969@maildrop.int.zabbadoz.net> <4C321409.2070500@freebsd.org> <4C343C68.8010302@freebsd.org> <4C36FB32.30901@freebsd.org> <4C39B0E6.3090400@freebsd.org> <4C39B7DE.3030100@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

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
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?alpine.BSF.2.00.1007111112490.1414>