Subject: Re: kern/13615: NetBSD current requires a .note.netbsd.ident section
To: Todd Vierling <tv@wasabisystems.com>
From: Andrew Cagney <cagney@mac.com>
List: netbsd-bugs
Date: 09/22/2001 00:39:02
[to pick up a very old thread]

Todd Vierling wrote:
>  On Thu, 2 Aug 2001, Andrew Cagney wrote:

>  : I think you mean FSF's GCC will be changed to use the NetBSD's installed
>  : /usr/lib/crt{begin,end}.
> 
>  
>  This is precisely what I said.  "GCC will be changed not to use its versions
>  of... (and use only NetBSD's...).  This means FSF's GCC...."


I re-checked my notes.

As far as I can tell gcc 3.0 introduced changes that made it impossible 
for it to use NetBSD's system supplied crt{begin,end}.


>  :   If the intent is to change FSF's gcc to use either NetBSD's installed
>  : crt{begin,end} or a distributed but custom NetBSD specific
>  : crt{begin,end} then I think you're guarenteeing constant bit rot.
> 
>  
>  GCC doesn't even provide working crtstuff for all platforms, so we have to
>  implement it ourselves anyway.

GCC 3.0 (for the PPC and based on MRG's e-mails also x86 and sparc) rely 
on both a crt{begin,end} and a crt{i,n}.  They combine in a way that is 
very different to NetBSD's current system supplied crt{begin,end} 
leading me to the conclusion that it simply isn't possible for GCC 3.0 
to use the exising system files.

Briefly, gcc creates an executable containing the following:


	crti (ncrti for GCC on NetBSD/PPC)

	Among other iteresting things this puts
	the _init()'s function prologue in .init
	and _fini()'s function prologue in .fini.
	It also contains other useful stuff such as
	exception handling gunk.  I figure we wan't
	to leave as much of this as is so that it will
	just work.


	crt0 (I managed to get things to use the NetBSD version)

	This calls _init() and registers the call to _fini()
	with atexit().


	crtbegin

	This appends calls to various functions to the end of
	the under construction .fini and .init sections.
	Remember, those sections
	already contain a function prelude so you can think
	of this as adding to the _init() and _fini()
	function bodies.


	your program files

	These continue the process of adding to the _init()
	and _fini() function bodies.

	crtend


	crtn (or ncrtn)

	This contains the function epalogue[sp]
	for _init() and _fini() so that they return
	after being called ....

So while NetBSD puts a single simple _init() function in crtbegin(). 
GCC 3.0 constructs both _init() and _fini() from the concatenation of 
crti, bit of compilation units (including crtbegin) and finally crtn.

So back to the original problem, I guess there are several options:

	o	move that note section to crt0 (which I think
		is more likely to be linked in then crtbegin.

	o	get gcc to include a .note.netbsd.ident section
		in one of its files.  Any one got a patch?

	o	document this as a feature in the gcc 3.x release
		notes.  For the moment I think I'll go with this
		one.

	o	something else.

Andrew