From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13271 invoked by alias); 23 Oct 2002 01:42:10 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 13221 invoked from network); 23 Oct 2002 01:42:09 -0000 Received: from unknown (HELO deimos.hpl.hp.com) (192.6.19.190) by sources.redhat.com with SMTP; 23 Oct 2002 01:42:09 -0000 Received: from hplms2.hpl.hp.com (hplms2.hpl.hp.com [15.0.152.33]) by deimos.hpl.hp.com (8.9.3 (PHNE_24419)/HPL-PA Relay) with ESMTP id SAA29988; Tue, 22 Oct 2002 18:42:08 -0700 (PDT) Received: from napali.hpl.hp.com (napali.hpl.hp.com [15.4.89.123]) by hplms2.hpl.hp.com (8.10.2/8.10.2 HPL-PA Hub) with ESMTP id g9N1g8V03695; Tue, 22 Oct 2002 18:42:08 -0700 (PDT) Received: from napali.hpl.hp.com (napali [127.0.0.1]) by napali.hpl.hp.com (8.12.3/8.12.3/Debian -4) with ESMTP id g9N1g8HW025412; Tue, 22 Oct 2002 18:42:08 -0700 Received: (from davidm@localhost) by napali.hpl.hp.com (8.12.3/8.12.3/Debian -4) id g9N1g72n025408; Tue, 22 Oct 2002 18:42:07 -0700 Date: Tue, 22 Oct 2002 18:46:00 -0000 From: David Mosberger Message-Id: <200210230142.g9N1g72n025408@napali.hpl.hp.com> To: libc-hacker@sources.redhat.com cc: hjl@lucon.org, davidm@napali.hpl.hp.com Subject: patch to make init_array work Reply-to: davidm@hpl.hp.com X-SW-Source: 2002-10/txt/msg00086.txt.bz2 The init_array support in glibc appears to be incomplete at the moment. HJ had a patch that made it all work (see http://sources.redhat.com/ml/libc-alpha/2002-03/msg00047.html) and I adapted his work for the current CVS tree. With the patch below applied, the included test cases work properly. Please apply this patch. Thanks, --david 2002-03-12 H.J. Lu * csu/init.c (__libc_preinit_array): New. Define if HAVE_INITFINI_ARRAY is defined. (__libc_init_array): Likewise. (__libc_fini_array): Likewise. * elf/Makefile (tests): Add tst-array1, tst-array2 and tst-array3 if $(have-initfini-array) is yes. (tests-static): Add tst-array3 if $(have-initfini-array) is yes. (modules-names): Add tst-array2dep if $(have-initfini-array) is yes. ($(objpfx)tst-array1.out): New target. ($(objpfx)tst-array2): Likewise. ($(objpfx)tst-array2.out): Likewise. ($(objpfx)tst-array3.out): Likewise. * elf/tst-array1.c: New file. * elf/tst-array1.exp: Likewise. * elf/tst-array2.c: Likewise. * elf/tst-array2dep.c: Likewise. * elf/tst-array2.exp: Likewise. * elf/tst-array3.c: Likewise. * sysdeps/generic/libc-start.c (__libc_start_main): Process __libc_preinit_array, __libc_init_array and __libc_fini_array if HAVE_INITFINI_ARRAY is defined. Index: csu/init.c =================================================================== RCS file: /cvs/glibc/libc/csu/init.c,v retrieving revision 1.4 diff -u -r1.4 init.c --- csu/csu/init.c 6 Jul 2001 04:54:45 -0000 1.4 +++ csu/csu/init.c 23 Oct 2002 01:34:29 -0000 @@ -25,3 +25,43 @@ const int _IO_stdin_used = _G_IO_IO_FILE_VERSION; #endif + +#ifdef HAVE_INITFINI_ARRAY +extern void (*__preinit_array_start []) (void); +extern void (*__preinit_array_end []) (void); + +void +__libc_preinit_array (void) +{ + unsigned int size, i; + + size = __preinit_array_end - __preinit_array_start; + for (i = 0; i < size; i++) + __preinit_array_start [i] (); +} + +extern void (*__init_array_start []) (void); +extern void (*__init_array_end []) (void); + +void +__libc_init_array (void) +{ + unsigned int size, i; + + size = __init_array_end - __init_array_start; + for (i = 0; i < size; i++) + __init_array_start [i] (); +} + +extern void (*__fini_array_start []) (void); +extern void (*__fini_array_end []) (void); + +void +__libc_fini_array (void) +{ + int i; + + for (i = __fini_array_end - __fini_array_start - 1; i >= 0; i--) + __fini_array_start [i] (); +} +#endif Index: elf/Makefile =================================================================== RCS file: /cvs/glibc/libc/elf/Makefile,v retrieving revision 1.241 diff -u -r1.241 Makefile --- elf/elf/Makefile 22 Oct 2002 06:22:38 -0000 1.241 +++ elf/elf/Makefile 23 Oct 2002 01:34:29 -0000 @@ -117,6 +117,9 @@ endif tests = tst-tls1 tst-tls2 tst-tls9 +ifeq (yes,$(have-initfini-array)) +tests += tst-array1 tst-array2 tst-array3 +endif ifeq (yes,$(build-static)) tests-static = tst-tls1-static tst-tls2-static ifeq (yesyesyes,$(build-static)$(build-shared)$(elf)) @@ -156,6 +159,9 @@ tst-tlsmod5 tst-tlsmod6 \ circlemod1 circlemod1a circlemod2 circlemod2a \ circlemod3 circlemod3a +ifeq (yes,$(have-initfini-array)) +modules-names += tst-array2dep +endif modules-vis-yes = vismod1 vismod2 vismod3 modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4 modules-nodlopen-yes = nodlopenmod nodlopenmod2 @@ -541,3 +547,22 @@ $(objpfx)tst-tls9-static: $(common-objpfx)dlfcn/libdl.a $(objpfx)tst-tls9-static.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so endif + +$(objpfx)tst-array1.out: $(objpfx)tst-array1 + $(elf-objpfx)$(rtld-installed-name) \ + --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ + $(objpfx)tst-array1 > $@ + cmp $@ tst-array1.exp > /dev/null + +$(objpfx)tst-array2: $(objpfx)tst-array2dep.so +$(objpfx)tst-array2.out: $(objpfx)tst-array2 + $(elf-objpfx)$(rtld-installed-name) \ + --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ + $(objpfx)tst-array2 > $@ + cmp $@ tst-array2.exp > /dev/null + +$(objpfx)tst-array3.out: $(objpfx)tst-array3 + $(elf-objpfx)$(rtld-installed-name) \ + --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ + $(objpfx)tst-array3 > $@ + cmp $@ tst-array1.exp > /dev/null Index: elf/tst-array1.c =================================================================== RCS file: elf/tst-array1.c diff -N elf/tst-array1.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ elf/elf/tst-array1.c 23 Oct 2002 01:34:29 -0000 @@ -0,0 +1,101 @@ +#include + +static void init (void) __attribute__ ((constructor)); + +static void +init (void) +{ + write (STDOUT_FILENO, "init\n", 5); +} + +static void fini (void) __attribute__ ((destructor)); + +static void +fini (void) +{ + write (STDOUT_FILENO, "fini\n", 5); +} + +static void +preinit_0 (void) +{ + write (STDOUT_FILENO, "preinit array 0\n", 16); +} + +static void +preinit_1 (void) +{ + write (STDOUT_FILENO, "preinit array 1\n", 16); +} + +static void +preinit_2 (void) +{ + write (STDOUT_FILENO, "preinit array 2\n", 16); +} + +void +(*preinit_array []) (void) __attribute__ ((section (".preinit_array"))) = +{ + &preinit_0, + &preinit_1, + &preinit_2 +}; + +static void +init_0 (void) +{ + write (STDOUT_FILENO, "init array 0\n", 13); +} + +static void +init_1 (void) +{ + write (STDOUT_FILENO, "init array 1\n", 13); +} + +static void +init_2 (void) +{ + write (STDOUT_FILENO, "init array 2\n", 13); +} + +void +(*init_array []) (void) __attribute__ ((section (".init_array"))) = +{ + &init_0, + &init_1, + &init_2 +}; + +static void +fini_0 (void) +{ + write (STDOUT_FILENO, "fini array 0\n", 13); +} + +static void +fini_1 (void) +{ + write (STDOUT_FILENO, "fini array 1\n", 13); +} + +static void +fini_2 (void) +{ + write (STDOUT_FILENO, "fini array 2\n", 13); +} + +void +(*fini_array []) (void) __attribute__ ((section (".fini_array"))) = +{ + &fini_0, + &fini_1, + &fini_2 +}; + +int +main (void) +{ + return 0; +} Index: elf/tst-array1.exp =================================================================== RCS file: elf/tst-array1.exp diff -N elf/tst-array1.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ elf/elf/tst-array1.exp 23 Oct 2002 01:34:29 -0000 @@ -0,0 +1,11 @@ +preinit array 0 +preinit array 1 +preinit array 2 +init +init array 0 +init array 1 +init array 2 +fini array 2 +fini array 1 +fini array 0 +fini Index: elf/tst-array2.c =================================================================== RCS file: elf/tst-array2.c diff -N elf/tst-array2.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ elf/elf/tst-array2.c 23 Oct 2002 01:34:29 -0000 @@ -0,0 +1 @@ +#include "tst-array1.c" Index: elf/tst-array2.exp =================================================================== RCS file: elf/tst-array2.exp diff -N elf/tst-array2.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ elf/elf/tst-array2.exp 23 Oct 2002 01:34:29 -0000 @@ -0,0 +1,19 @@ +preinit array 0 +preinit array 1 +preinit array 2 +DSO init +DSO init array 0 +DSO init array 1 +DSO init array 2 +init +init array 0 +init array 1 +init array 2 +fini array 2 +fini array 1 +fini array 0 +fini +DSO fini array 2 +DSO fini array 1 +DSO fini array 0 +DSO fini Index: elf/tst-array2dep.c =================================================================== RCS file: elf/tst-array2dep.c diff -N elf/tst-array2dep.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ elf/elf/tst-array2dep.c 23 Oct 2002 01:34:29 -0000 @@ -0,0 +1,69 @@ +#include + +static void init (void) __attribute__ ((constructor)); + +static void +init (void) +{ + write (STDOUT_FILENO, "DSO init\n", 9); +} + +static void fini (void) __attribute__ ((destructor)); + +static void +fini (void) +{ + write (STDOUT_FILENO, "DSO fini\n", 9); +} + +static void +init_0 (void) +{ + write (STDOUT_FILENO, "DSO init array 0\n", 17); +} + +static void +init_1 (void) +{ + write (STDOUT_FILENO, "DSO init array 1\n", 17); +} + +static void +init_2 (void) +{ + write (STDOUT_FILENO, "DSO init array 2\n", 17); +} + +void +(*init_array []) (void) __attribute__ ((section (".init_array"))) = +{ + &init_0, + &init_1, + &init_2 +}; + +static void +fini_0 (void) +{ + write (STDOUT_FILENO, "DSO fini array 0\n", 17); +} + +static void +fini_1 (void) +{ + write (STDOUT_FILENO, "DSO fini array 1\n", 17); +} + +static void +fini_2 (void) +{ + write (STDOUT_FILENO, "DSO fini array 2\n", 17); +} + +void +(*fini_array []) (void) __attribute__ ((section (".fini_array"))) = +{ + &fini_0, + &fini_1, + &fini_2 +}; Index: elf/tst-array3.c =================================================================== RCS file: elf/tst-array3.c diff -N elf/tst-array3.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ elf/elf/tst-array3.c 23 Oct 2002 01:34:29 -0000 @@ -0,0 +1 @@ +#include "tst-array1.c" Index: sysdeps/generic/libc-start.c =================================================================== RCS file: /cvs/glibc/libc/sysdeps/generic/libc-start.c,v retrieving revision 1.31 diff -u -r1.31 libc-start.c --- sysdeps/generic/sysdeps/generic/libc-start.c 15 Sep 2002 05:44:24 -0000 1.31 +++ sysdeps/generic/sysdeps/generic/libc-start.c 23 Oct 2002 01:34:30 -0000 @@ -38,6 +38,16 @@ ; #endif +#ifdef HAVE_INITFINI_ARRAY +# ifdef SHARED +extern void __libc_init_array (void) __attribute__ ((weak)); +extern void __libc_fini_array (void) __attribute__ ((weak)); +# else +extern void __libc_preinit_array (void); +extern void __libc_init_array (void); +extern void __libc_fini_array (void); +# endif +#endif extern int BP_SYM (__libc_start_main) (int (*main) (int, char **, char **), int argc, @@ -122,6 +132,17 @@ if (fini) __cxa_atexit ((void (*) (void *)) fini, NULL, NULL); +#ifdef HAVE_INITFINI_ARRAY +# ifdef SHARED + if (__libc_fini_array) +# endif + __cxa_atexit ((void (*) (void *)) __libc_fini_array, NULL, NULL); + +# ifndef SHARED + __libc_preinit_array (); +# endif +#endif + /* Call the initializer of the program, if any. */ #ifdef SHARED if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) @@ -129,6 +150,13 @@ #endif if (init) (*init) (); + +#ifdef HAVE_INITFINI_ARRAY +# ifdef SHARED + if (__libc_init_array) +# endif + __libc_init_array (); +#endif #ifdef SHARED if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))