diff --git a/ChangeLog b/ChangeLog index 78927b47ae..5d9cc541bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2005-02-14 H.J. Lu + + * csu/elf-init.c (__libc_csu_fini): Enable if LIBC_NONSHARED + isn't defined. + * sysdeps/generic/libc-start.c (LIBC_START_MAIN): Call fini + if SHARED isn't defined. + * elf/Makefile (tests-static): Add tst-array1-static. + ($(objpfx)tst-array1-static.out): New target. + * elf/tst-array1-static.c: New file. + 2005-02-11 Jakub Jelinek * debug/chk_fail.c (__chk_fail): Add a while (1) loop around diff --git a/csu/elf-init.c b/csu/elf-init.c index 691e27fab7..7ac79446d6 100644 --- a/csu/elf-init.c +++ b/csu/elf-init.c @@ -92,7 +92,7 @@ __libc_csu_init (void) void __libc_csu_fini (void) { -#if 0 +#ifndef LIBC_NONSHARED #ifdef HAVE_INITFINI_ARRAY size_t i = __fini_array_end - __fini_array_start; while (i-- > 0) diff --git a/elf/Makefile b/elf/Makefile index 47e6ea4d58..6c34d8ab44 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -138,6 +138,9 @@ tests += tst-array1 tst-array2 tst-array3 tst-array4 endif ifeq (yes,$(build-static)) tests-static = tst-tls1-static tst-tls2-static +ifeq (yes,$(have-initfini-array)) +tests-static += tst-array1-static +endif ifeq (yesyesyes,$(build-static)$(build-shared)$(elf)) tests-static += tst-tls9-static tst-tls9-static-ENV = \ @@ -701,6 +704,10 @@ $(objpfx)tst-array1.out: $(objpfx)tst-array1 $(objpfx)tst-array1 > $@ cmp $@ tst-array1.exp > /dev/null +$(objpfx)tst-array1-static.out: $(objpfx)tst-array1-static + $(objpfx)tst-array1-static > $@ + 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) \ diff --git a/elf/tst-array1-static.c b/elf/tst-array1-static.c new file mode 100644 index 0000000000..21539a4212 --- /dev/null +++ b/elf/tst-array1-static.c @@ -0,0 +1 @@ +#include "tst-array1.c" diff --git a/sysdeps/generic/libc-start.c b/sysdeps/generic/libc-start.c index 5bb8a9b352..fdf398ada6 100644 --- a/sysdeps/generic/libc-start.c +++ b/sysdeps/generic/libc-start.c @@ -81,9 +81,9 @@ STATIC int LIBC_START_MAIN (int (*main) (int, char **, char ** __attribute__ ((noreturn)); -/* Note: the fini parameter is ignored here. It used to be registered - with __cxa_atexit. This had the disadvantage that finalizers were - called in more than one place. */ +/* Note: the fini parameter is ignored here for shared library. It + is registered with __cxa_atexit. This had the disadvantage that + finalizers were called in more than one place. */ STATIC int LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), int argc, char *__unbounded *__unbounded ubp_av, @@ -155,14 +155,16 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), if (__builtin_expect (rtld_fini != NULL, 1)) __cxa_atexit ((void (*) (void *)) rtld_fini, NULL, NULL); +#ifndef SHARED /* Call the initializer of the libc. This is only needed here if we are compiling for the static library in which case we haven't run the constructors in `_dl_start_user'. */ -#ifndef SHARED __libc_init_first (argc, argv, __environ); -#endif -#ifndef SHARED + /* Register the destructor of the program, if any. */ + if (fini) + __cxa_atexit ((void (*) (void *)) fini, NULL, NULL); + /* Some security at this point. Prevent starting a SUID binary where the standard file descriptors are not opened. We have to do this only for statically linked applications since otherwise the dynamic