Module Name:    src
Committed By:   joerg
Date:           Mon Mar  7 05:09:12 UTC 2011

Modified Files:
        src/lib/csu/alpha: crt0.c
        src/lib/csu/arm_elf: crt0.c
        src/lib/csu/common: crt0-common.c
        src/lib/csu/common_elf: common.h
        src/lib/csu/hppa: crt0.c
        src/lib/csu/ia64: crt0.c
        src/lib/csu/m68k_elf: crt0.c
        src/lib/csu/powerpc: crt0.c
        src/lib/csu/powerpc64: crt0.c
        src/lib/csu/sh3_elf: crt0.c
        src/lib/csu/sparc64: crt0.c
        src/lib/csu/sparc_elf: crt0.c
        src/lib/csu/vax_elf: crt0.c
        src/lib/libc/dlfcn: dlfcn_elf.c
        src/lib/libc/misc: initfini.c
        src/lib/libc/stdlib: exit.c
        src/sys/compat/netbsd32: netbsd32_exec_elf32.c
        src/sys/kern: exec_elf.c

Log Message:
Pass down ELF Auxillary Vectors for static NetBSD binaries too.
Rename __libc_init to _libc_init and call it explicitly from CSU code.
This enforces the constructor run order for newly linked programs.
Keep it as constructor with run-once semantic for binary compatibility.
Implement dl_iterate_phdr for statically linked programs.

This material is based upon work partially supported by
The NetBSD Foundation under a contract with Joerg Sonnenberger.


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/lib/csu/alpha/crt0.c
cvs rdiff -u -r1.8 -r1.9 src/lib/csu/arm_elf/crt0.c
cvs rdiff -u -r1.4 -r1.5 src/lib/csu/common/crt0-common.c
cvs rdiff -u -r1.14 -r1.15 src/lib/csu/common_elf/common.h
cvs rdiff -u -r1.9 -r1.10 src/lib/csu/hppa/crt0.c
cvs rdiff -u -r1.3 -r1.4 src/lib/csu/ia64/crt0.c
cvs rdiff -u -r1.12 -r1.13 src/lib/csu/m68k_elf/crt0.c
cvs rdiff -u -r1.28 -r1.29 src/lib/csu/powerpc/crt0.c
cvs rdiff -u -r1.3 -r1.4 src/lib/csu/powerpc64/crt0.c
cvs rdiff -u -r1.11 -r1.12 src/lib/csu/sh3_elf/crt0.c
cvs rdiff -u -r1.25 -r1.26 src/lib/csu/sparc64/crt0.c
cvs rdiff -u -r1.13 -r1.14 src/lib/csu/sparc_elf/crt0.c
cvs rdiff -u -r1.11 -r1.12 src/lib/csu/vax_elf/crt0.c
cvs rdiff -u -r1.7 -r1.8 src/lib/libc/dlfcn/dlfcn_elf.c
cvs rdiff -u -r1.7 -r1.8 src/lib/libc/misc/initfini.c
cvs rdiff -u -r1.13 -r1.14 src/lib/libc/stdlib/exit.c
cvs rdiff -u -r1.32 -r1.33 src/sys/compat/netbsd32/netbsd32_exec_elf32.c
cvs rdiff -u -r1.28 -r1.29 src/sys/kern/exec_elf.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/csu/alpha/crt0.c
diff -u src/lib/csu/alpha/crt0.c:1.25 src/lib/csu/alpha/crt0.c:1.26
--- src/lib/csu/alpha/crt0.c:1.25	Tue Feb 22 05:45:05 2011
+++ src/lib/csu/alpha/crt0.c	Mon Mar  7 05:09:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.25 2011/02/22 05:45:05 joerg Exp $ */
+/* $NetBSD: crt0.c,v 1.26 2011/03/07 05:09:09 joerg Exp $ */
 
 /*
  * Copyright (c) 1995 Christopher G. Demetriou
@@ -69,6 +69,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -84,7 +86,7 @@
  * NOTE: Leave the RCS ID _after_ __start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.25 2011/02/22 05:45:05 joerg Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.26 2011/03/07 05:09:09 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/arm_elf/crt0.c
diff -u src/lib/csu/arm_elf/crt0.c:1.8 src/lib/csu/arm_elf/crt0.c:1.9
--- src/lib/csu/arm_elf/crt0.c:1.8	Tue Feb 22 05:45:05 2011
+++ src/lib/csu/arm_elf/crt0.c	Mon Mar  7 05:09:09 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: crt0.c,v 1.8 2011/02/22 05:45:05 joerg Exp $	*/
+/*	$NetBSD: crt0.c,v 1.9 2011/03/07 05:09:09 joerg Exp $	*/
 
 /*
  * Copyright (C) 1997 Mark Brinicombe
@@ -68,7 +68,7 @@
 "	b	" ___STRING(_C_LABEL(___start)) " ");
 
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.8 2011/02/22 05:45:05 joerg Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.9 2011/03/07 05:09:09 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 void
@@ -93,6 +93,8 @@
                 _rtld_setup(cleanup, obj);
 #endif	/* DYNAMIC */
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);

Index: src/lib/csu/common/crt0-common.c
diff -u src/lib/csu/common/crt0-common.c:1.4 src/lib/csu/common/crt0-common.c:1.5
--- src/lib/csu/common/crt0-common.c:1.4	Tue Feb 22 05:45:06 2011
+++ src/lib/csu/common/crt0-common.c	Mon Mar  7 05:09:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0-common.c,v 1.4 2011/02/22 05:45:06 joerg Exp $ */
+/* $NetBSD: crt0-common.c,v 1.5 2011/03/07 05:09:09 joerg Exp $ */
 
 /*
  * Copyright (c) 1998 Christos Zoulas
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: crt0-common.c,v 1.4 2011/02/22 05:45:06 joerg Exp $");
+__RCSID("$NetBSD: crt0-common.c,v 1.5 2011/03/07 05:09:09 joerg Exp $");
 
 #include <sys/types.h>
 #include <sys/syscall.h>
@@ -50,6 +50,7 @@
 
 extern void	_init(void);
 extern void	_fini(void);
+extern void	_libc_init(void);
 
 /*
  * Arrange for _DYNAMIC to be weak and undefined (and therefore to show up
@@ -115,6 +116,8 @@
 		atexit(cleanup);
 	}
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&__eprol, (u_long)&__etext);

Index: src/lib/csu/common_elf/common.h
diff -u src/lib/csu/common_elf/common.h:1.14 src/lib/csu/common_elf/common.h:1.15
--- src/lib/csu/common_elf/common.h:1.14	Tue Feb 22 05:45:06 2011
+++ src/lib/csu/common_elf/common.h	Mon Mar  7 05:09:09 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: common.h,v 1.14 2011/02/22 05:45:06 joerg Exp $ */
+/* $NetBSD: common.h,v 1.15 2011/03/07 05:09:09 joerg Exp $ */
 
 /*
  * Copyright (c) 1995 Christopher G. Demetriou
@@ -71,6 +71,7 @@
 
 extern void	_init(void);
 extern void	_fini(void);
+extern void	_libc_init(void);
 
 #ifdef DYNAMIC
 void	_rtld_setup(void (*)(void), const Obj_Entry *obj);

Index: src/lib/csu/hppa/crt0.c
diff -u src/lib/csu/hppa/crt0.c:1.9 src/lib/csu/hppa/crt0.c:1.10
--- src/lib/csu/hppa/crt0.c:1.9	Wed Feb 23 10:26:09 2011
+++ src/lib/csu/hppa/crt0.c	Mon Mar  7 05:09:10 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: crt0.c,v 1.9 2011/02/23 10:26:09 skrll Exp $	*/
+/*	$NetBSD: crt0.c,v 1.10 2011/03/07 05:09:10 joerg Exp $	*/
 
 /*
  * Copyright (c) 2002 Matt Fredette
@@ -93,6 +93,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -131,7 +133,7 @@
  * NOTE: Leave the RCS ID _after_ __start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.9 2011/02/23 10:26:09 skrll Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.10 2011/03/07 05:09:10 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/ia64/crt0.c
diff -u src/lib/csu/ia64/crt0.c:1.3 src/lib/csu/ia64/crt0.c:1.4
--- src/lib/csu/ia64/crt0.c:1.3	Tue Feb 22 05:45:06 2011
+++ src/lib/csu/ia64/crt0.c	Mon Mar  7 05:09:10 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.3 2011/02/22 05:45:06 joerg Exp $ */
+/* $NetBSD: crt0.c,v 1.4 2011/03/07 05:09:10 joerg Exp $ */
 
 /*
  * Copyright (c) 1995 Christopher G. Demetriou
@@ -76,6 +76,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -91,7 +93,7 @@
  * NOTE: Leave the RCS ID _after_ __start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.3 2011/02/22 05:45:06 joerg Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.4 2011/03/07 05:09:10 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/m68k_elf/crt0.c
diff -u src/lib/csu/m68k_elf/crt0.c:1.12 src/lib/csu/m68k_elf/crt0.c:1.13
--- src/lib/csu/m68k_elf/crt0.c:1.12	Tue Feb 22 05:45:06 2011
+++ src/lib/csu/m68k_elf/crt0.c	Mon Mar  7 05:09:10 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.12 2011/02/22 05:45:06 joerg Exp $ */
+/* $NetBSD: crt0.c,v 1.13 2011/03/07 05:09:10 joerg Exp $ */
 
 /*
  * Copyright (c) 1999 Klaus Klein
@@ -79,6 +79,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -94,7 +96,7 @@
  * NOTE: Leave the RCS ID _after_ __start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.12 2011/02/22 05:45:06 joerg Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.13 2011/03/07 05:09:10 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/powerpc/crt0.c
diff -u src/lib/csu/powerpc/crt0.c:1.28 src/lib/csu/powerpc/crt0.c:1.29
--- src/lib/csu/powerpc/crt0.c:1.28	Sat Feb 26 17:11:23 2011
+++ src/lib/csu/powerpc/crt0.c	Mon Mar  7 05:09:10 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.28 2011/02/26 17:11:23 matt Exp $ */
+/* $NetBSD: crt0.c,v 1.29 2011/03/07 05:09:10 joerg Exp $ */
 
 /*
  * Copyright (c) 1997 Jason R. Thorpe.
@@ -92,6 +92,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -107,7 +109,7 @@
  * NOTE: Leave the RCS ID _after_ __start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.28 2011/02/26 17:11:23 matt Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.29 2011/03/07 05:09:10 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/powerpc64/crt0.c
diff -u src/lib/csu/powerpc64/crt0.c:1.3 src/lib/csu/powerpc64/crt0.c:1.4
--- src/lib/csu/powerpc64/crt0.c:1.3	Tue Feb 22 05:45:07 2011
+++ src/lib/csu/powerpc64/crt0.c	Mon Mar  7 05:09:10 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.3 2011/02/22 05:45:07 joerg Exp $ */
+/* $NetBSD: crt0.c,v 1.4 2011/03/07 05:09:10 joerg Exp $ */
 
 /*
  * Copyright (c) 1997 Jason R. Thorpe.
@@ -78,6 +78,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -93,7 +95,7 @@
  * NOTE: Leave the RCS ID _after_ __start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.3 2011/02/22 05:45:07 joerg Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.4 2011/03/07 05:09:10 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/sh3_elf/crt0.c
diff -u src/lib/csu/sh3_elf/crt0.c:1.11 src/lib/csu/sh3_elf/crt0.c:1.12
--- src/lib/csu/sh3_elf/crt0.c:1.11	Tue Feb 22 05:45:07 2011
+++ src/lib/csu/sh3_elf/crt0.c	Mon Mar  7 05:09:11 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.11 2011/02/22 05:45:07 joerg Exp $ */
+/* $NetBSD: crt0.c,v 1.12 2011/03/07 05:09:11 joerg Exp $ */
 
 /*
  * Copyright (c) 1998 Christos Zoulas
@@ -73,6 +73,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -88,7 +90,7 @@
  * NOTE: Leave the RCS ID _after_ __start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.11 2011/02/22 05:45:07 joerg Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.12 2011/03/07 05:09:11 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/sparc64/crt0.c
diff -u src/lib/csu/sparc64/crt0.c:1.25 src/lib/csu/sparc64/crt0.c:1.26
--- src/lib/csu/sparc64/crt0.c:1.25	Tue Feb 22 05:45:07 2011
+++ src/lib/csu/sparc64/crt0.c	Mon Mar  7 05:09:11 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.25 2011/02/22 05:45:07 joerg Exp $ */
+/* $NetBSD: crt0.c,v 1.26 2011/03/07 05:09:11 joerg Exp $ */
 
 /*
  * Copyright (c) 1995 Christopher G. Demetriou
@@ -98,6 +98,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -113,7 +115,7 @@
  * NOTE: Leave the RCS ID _after_ _start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.25 2011/02/22 05:45:07 joerg Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.26 2011/03/07 05:09:11 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/sparc_elf/crt0.c
diff -u src/lib/csu/sparc_elf/crt0.c:1.13 src/lib/csu/sparc_elf/crt0.c:1.14
--- src/lib/csu/sparc_elf/crt0.c:1.13	Tue Feb 22 05:45:08 2011
+++ src/lib/csu/sparc_elf/crt0.c	Mon Mar  7 05:09:11 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.13 2011/02/22 05:45:08 joerg Exp $ */
+/* $NetBSD: crt0.c,v 1.14 2011/03/07 05:09:11 joerg Exp $ */
 
 /*
  * Copyright (c) 1998 Christos Zoulas
@@ -83,6 +83,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -98,7 +100,7 @@
  * NOTE: Leave the RCS ID _after_ __start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.13 2011/02/22 05:45:08 joerg Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.14 2011/03/07 05:09:11 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/csu/vax_elf/crt0.c
diff -u src/lib/csu/vax_elf/crt0.c:1.11 src/lib/csu/vax_elf/crt0.c:1.12
--- src/lib/csu/vax_elf/crt0.c:1.11	Tue Feb 22 05:45:08 2011
+++ src/lib/csu/vax_elf/crt0.c	Mon Mar  7 05:09:11 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: crt0.c,v 1.11 2011/02/22 05:45:08 joerg Exp $ */
+/* $NetBSD: crt0.c,v 1.12 2011/03/07 05:09:11 joerg Exp $ */
 
 /*
  * Copyright (c) 1999 Matt Thomas
@@ -80,6 +80,8 @@
 		_rtld_setup(cleanup, obj);
 #endif
 
+	_libc_init();
+
 #ifdef MCRT0
 	atexit(_mcleanup);
 	monstartup((u_long)&_eprol, (u_long)&_etext);
@@ -95,7 +97,7 @@
  * NOTE: Leave the RCS ID _after_ __start(), in case it gets placed in .text.
  */
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: crt0.c,v 1.11 2011/02/22 05:45:08 joerg Exp $");
+__RCSID("$NetBSD: crt0.c,v 1.12 2011/03/07 05:09:11 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include "common.c"

Index: src/lib/libc/dlfcn/dlfcn_elf.c
diff -u src/lib/libc/dlfcn/dlfcn_elf.c:1.7 src/lib/libc/dlfcn/dlfcn_elf.c:1.8
--- src/lib/libc/dlfcn/dlfcn_elf.c:1.7	Sat Oct 16 10:27:07 2010
+++ src/lib/libc/dlfcn/dlfcn_elf.c	Mon Mar  7 05:09:11 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: dlfcn_elf.c,v 1.7 2010/10/16 10:27:07 skrll Exp $	*/
+/*	$NetBSD: dlfcn_elf.c,v 1.8 2011/03/07 05:09:11 joerg Exp $	*/
 
 /*
  * Copyright (c) 2000 Takuya SHIOZAKI
@@ -27,10 +27,14 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: dlfcn_elf.c,v 1.7 2010/10/16 10:27:07 skrll Exp $");
+__RCSID("$NetBSD: dlfcn_elf.c,v 1.8 2011/03/07 05:09:11 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
+#include "reentrant.h"
 #include "namespace.h"
+#include <elf.h>
+#include <errno.h>
+#include <string.h>
 
 #undef dlopen
 #undef dlclose
@@ -128,11 +132,61 @@
 	return -1;
 }
 
+static once_t dl_iterate_phdr_once = ONCE_INITIALIZER;
+static const char *dlpi_name;
+static Elf_Addr dlpi_addr;
+static const Elf_Phdr *dlpi_phdr;
+static Elf_Half dlpi_phnum;
+
+/*
+ * Declare as common symbol to allow new libc with older binaries to
+ * not trigger an undefined reference.
+ */
+extern __dso_hidden void *__auxinfo;
+
+static void
+dl_iterate_phdr_setup(void)
+{
+	const AuxInfo *aux;
+
+	if (__auxinfo == NULL)
+		return;
+
+	for (aux = __auxinfo; aux->a_type != AT_NULL; ++aux) {
+		switch (aux->a_type) {
+		case AT_BASE:
+			dlpi_addr = aux->a_v;
+			break;
+		case AT_PHDR:
+			dlpi_phdr = (void *)aux->a_v;
+			break;
+		case AT_PHNUM:
+			dlpi_phnum = aux->a_v;
+			break;
+		case AT_SUN_EXECNAME:
+			dlpi_name = (void *)aux->a_v;
+			break;
+		}
+	}
+}
+
 /*ARGSUSED*/
 int
 dl_iterate_phdr(int (*callback)(struct dl_phdr_info *, size_t, void *),
     void *data)
 {
+	struct dl_phdr_info phdr_info;
 
-	return 0;
+	if (__auxinfo == NULL)
+		return EOPNOTSUPP;
+
+	thr_once(&dl_iterate_phdr_once, dl_iterate_phdr_setup);
+
+	memset(&phdr_info, 0, sizeof(phdr_info));
+	phdr_info.dlpi_addr = dlpi_addr;
+	phdr_info.dlpi_phdr = dlpi_phdr;
+	phdr_info.dlpi_phnum = dlpi_phnum;
+	phdr_info.dlpi_name = dlpi_name;
+
+	return callback(&phdr_info, sizeof(phdr_info), data);
 }

Index: src/lib/libc/misc/initfini.c
diff -u src/lib/libc/misc/initfini.c:1.7 src/lib/libc/misc/initfini.c:1.8
--- src/lib/libc/misc/initfini.c:1.7	Sun Nov 14 18:11:42 2010
+++ src/lib/libc/misc/initfini.c	Mon Mar  7 05:09:11 2011
@@ -1,4 +1,4 @@
-/* 	$NetBSD: initfini.c,v 1.7 2010/11/14 18:11:42 tron Exp $	 */
+/* 	$NetBSD: initfini.c,v 1.8 2011/03/07 05:09:11 joerg Exp $	 */
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -30,13 +30,17 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: initfini.c,v 1.7 2010/11/14 18:11:42 tron Exp $");
+__RCSID("$NetBSD: initfini.c,v 1.8 2011/03/07 05:09:11 joerg Exp $");
 
 #ifdef _LIBC
 #include "namespace.h"
 #endif
 
-void	__libc_init(void) __attribute__((__constructor__, __used__));
+#include <sys/param.h>
+#include <sys/exec.h>
+#include <stdbool.h>
+
+void	_libc_init(void) __attribute__((__constructor__, __used__));
 
 void	__guard_setup(void);
 void	__libc_thr_init(void);
@@ -44,11 +48,30 @@
 void	__libc_atexit_init(void);
 void	__libc_env_init(void);
 
-/* LINTED used */
+static bool libc_initialised;
+
+void _libc_init(void);
+
+__dso_hidden void	*__auxinfo;
+struct ps_strings *__ps_strings;
+
+/*
+ * _libc_init is called twice.  The first time explicitly by crt0.o
+ * (for newer versions) and the second time as indirectly via _init().
+ */
 void
-__libc_init(void)
+_libc_init(void)
 {
 
+	if (libc_initialised)
+		return;
+
+	libc_initialised = 1;
+
+	if (__ps_strings != NULL)
+		__auxinfo = __ps_strings->ps_argvstr +
+		    __ps_strings->ps_nargvstr + __ps_strings->ps_nenvstr + 2;
+
 	/* For -fstack-protector */
 	__guard_setup();
 

Index: src/lib/libc/stdlib/exit.c
diff -u src/lib/libc/stdlib/exit.c:1.13 src/lib/libc/stdlib/exit.c:1.14
--- src/lib/libc/stdlib/exit.c:1.13	Thu Sep  9 10:19:31 2010
+++ src/lib/libc/stdlib/exit.c	Mon Mar  7 05:09:12 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: exit.c,v 1.13 2010/09/09 10:19:31 skrll Exp $	*/
+/*	$NetBSD: exit.c,v 1.14 2011/03/07 05:09:12 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)exit.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: exit.c,v 1.13 2010/09/09 10:19:31 skrll Exp $");
+__RCSID("$NetBSD: exit.c,v 1.14 2011/03/07 05:09:12 joerg Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -45,13 +45,6 @@
 #include "atexit.h"
 #endif
 
-#ifdef _LIBC
-extern void __libc_init(void);
-#ifndef __lint
-static void (*force_ref)(void) __used = __libc_init;
-#endif
-#endif
-
 void (*__cleanup) __P((void));
 
 /*

Index: src/sys/compat/netbsd32/netbsd32_exec_elf32.c
diff -u src/sys/compat/netbsd32/netbsd32_exec_elf32.c:1.32 src/sys/compat/netbsd32/netbsd32_exec_elf32.c:1.33
--- src/sys/compat/netbsd32/netbsd32_exec_elf32.c:1.32	Mon Dec 14 04:09:38 2009
+++ src/sys/compat/netbsd32/netbsd32_exec_elf32.c	Mon Mar  7 05:09:12 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_exec_elf32.c,v 1.32 2009/12/14 04:09:38 mrg Exp $	*/
+/*	$NetBSD: netbsd32_exec_elf32.c,v 1.33 2011/03/07 05:09:12 joerg Exp $	*/
 /*	from: NetBSD: exec_aout.c,v 1.15 1996/09/26 23:34:46 cgd Exp */
 
 /*
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_exec_elf32.c,v 1.32 2009/12/14 04:09:38 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_exec_elf32.c,v 1.33 2011/03/07 05:09:12 joerg Exp $");
 
 #define	ELFSIZE		32
 
@@ -115,7 +115,7 @@
 		extern const char machine32[];
 		(void)compat_elf_check_interp(epp, itp, machine32);
 	}
-	epp->ep_flags |= EXEC_32;
+	epp->ep_flags |= EXEC_32 | EXEC_FORCEAUX;
 	epp->ep_vm_minaddr = VM_MIN_ADDRESS;
 	epp->ep_vm_maxaddr = USRSTACK32;
 #ifdef ELF_INTERP_NON_RELOCATABLE

Index: src/sys/kern/exec_elf.c
diff -u src/sys/kern/exec_elf.c:1.28 src/sys/kern/exec_elf.c:1.29
--- src/sys/kern/exec_elf.c:1.28	Tue Feb 15 11:43:53 2011
+++ src/sys/kern/exec_elf.c	Mon Mar  7 05:09:12 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: exec_elf.c,v 1.28 2011/02/15 11:43:53 pooka Exp $	*/
+/*	$NetBSD: exec_elf.c,v 1.29 2011/03/07 05:09:12 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1994, 2000, 2005 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.28 2011/02/15 11:43:53 pooka Exp $");
+__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.29 2011/03/07 05:09:12 joerg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_pax.h"
@@ -936,5 +936,6 @@
 #elif defined(ELF_INTERP_NON_RELOCATABLE)
 	*pos = ELF_LINK_ADDR;
 #endif
+	epp->ep_flags |= EXEC_FORCEAUX;
 	return 0;
 }

Reply via email to