From owner-freebsd-hackers@FreeBSD.ORG Sun Jul 11 21:40:16 2010 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 02D2E106566B for ; Sun, 11 Jul 2010 21:40:16 +0000 (UTC) (envelope-from jroberson@jroberson.net) Received: from mail-px0-f182.google.com (mail-px0-f182.google.com [209.85.212.182]) by mx1.freebsd.org (Postfix) with ESMTP id CECF28FC17 for ; Sun, 11 Jul 2010 21:40:15 +0000 (UTC) Received: by pxi8 with SMTP id 8so1723778pxi.13 for ; Sun, 11 Jul 2010 14:40:15 -0700 (PDT) Received: by 10.114.111.5 with SMTP id j5mr15028256wac.27.1278882852044; Sun, 11 Jul 2010 14:14:12 -0700 (PDT) Received: from [10.0.1.198] (udp022762uds.hawaiiantel.net [72.234.79.107]) by mx.google.com with ESMTPS id d38sm56250680wam.8.2010.07.11.14.14.09 (version=SSLv3 cipher=RC4-MD5); Sun, 11 Jul 2010 14:14:11 -0700 (PDT) Date: Sun, 11 Jul 2010 11:15:00 -1000 (HST) From: Jeff Roberson X-X-Sender: jroberson@desktop To: Andriy Gapon In-Reply-To: <4C39B7DE.3030100@freebsd.org> Message-ID: 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> User-Agent: Alpine 2.00 (BSF 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Mailman-Approved-At: Mon, 12 Jul 2010 11:11:47 +0000 Cc: Peter Wemm , freebsd-hackers@freebsd.org, Jeff Roberson , Konstantin Belousov , "Bjoern A. Zeeb" Subject: Re: elf obj load: skip zero-sized sections early X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Jul 2010 21:40:16 -0000 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 >