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>