Subject: Re: CVS commit: src/lib/csu/i386_elf
To: Jason Thorpe <thorpej@shagadelic.org>
From: David Laight <david@l8s.co.uk>
List: source-changes
Date: 05/17/2006 22:07:40
On Wed, May 17, 2006 at 01:30:29PM -0700, Jason Thorpe wrote:
> 
> On May 17, 2006, at 1:12 PM, Christos Zoulas wrote:
> 
> >You need to __attribute__((__weakref__)) all such symbols, and then it
> >works again :-)
> 
> I would suggest the following, then:
> 
> Define a new macro in cdefs_elf.h:
> 
> #if __GNUC_PREREQ__(4, 0)	/* or whatever version __weakref__ first  
> appeared */
> #define	__weak_reference	__attribute__((__weakref__))
> #define	__weak_extern(sym)	/* nothing - deprecated - will 
> remove in  NetBSD 5.0 */
> #else
> #define	__weak_reference	/* nothing */
> #define	__weak_extern(sym)	__asm(".weak "_C_LABEL_STRING(#sym));
> #endif
> 
> 
> Find all the places that use __weak_extern().  Change them from:
> 
> extern int _DYNAMIC;
> __weak_extern(_DYNAMIC);
> 
> to:
> 
> extern int _DYNAMIC __weak_reference;
> #ifdef __weak_extern
> __weak_extern(_DYNAMIC);
> #endif

Why not:
#if __GNUC_PREREQ__(4, 0)
#define __weak_reference(t, n) extern t n __attribute__((__weakref__))
#else
#define __weak_reference(t, n) extern t n; __asm(".weak "_C_LABEL_STRING(#n))
#endif

so the code just becomes:

__weak_reference(int, _DYNAMIC);

(Or does this cause too much grief with weak functions?)

	David

-- 
David Laight: david@l8s.co.uk