From dacc8ffa420575038f04c543c31065fea81d5732 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 30 Mar 2000 16:30:49 +0000 Subject: Update. 2000-03-30 Ulrich Drepper Implement dynamic determination of constructor/destructor order in the dynamic linker. * elf/Versions [ld.so] (GLIBC_2.0): Remove _dl_init_next. (GLIBC_2.2): Add _dl_init. * elf/dl-close.c: Also call all destructors in FINI_ARRAY. r_duplist is not anymore allocated separately. l_initfini is and therefore free it if necessary. * elf/dl-deps.c: If a searchlist has to be allocated, put all in one malloc block. Otherwise allocate l_initfini list only. Put dependencies for the object in l_initfini list. Sort dependencies for the object to be loaded topologically. * elf/dl-fini.c: Before running the destructors sort the topologically. * elf/dl-init.c (_dl_init): Renamed from _dl_init_next. Rewrite to call constructors instead of iterating over the pointers. Get list of objects for which to run constructors from l_initfini element. Accept argc, argv, and env as parameters and pass them to the constructors. * elf/ld-load.c (_dl_map_object_from_fd): Initialize l_ldnum member with size of dynamic section. * elf/dl-open.c (dl_open_worker): Only call _dl_init instead of _dl_init_next and calling constructors ourself. * elf/dl-preinit.c (_dl_preinit): Renamed from _dl_preinit_next. Take argc, argv, and env as parameters and pass them to the constructors. Rewrite to call all constructors and not iterate over the pointers. * elf/dynamic-link.h: Don't relocate DT_FINI_ARRAY entry. Don't precompute l_initcount and l_preinitcount. * elf/link.h (struct link_map): Add l_ldnum member. Make l_phdr_allocated part of the bitfield. Remove l_runcount, l_initcount, and l_preinitcount. Add l_initfini. * sysdeps/generic/ldsodefs.h: Replace _dl_init_next prototype with one for _dl_init. * sysdeps/i386/dl-machine (RTLD_START): Rewrite to match new init function interface. * sysdeps/unix/sysv/linux/init-first.h: Removed. * sysdeps/unix/sysv/linux/Dist: Delete file here as well. * sysdeps/unix/sysv/linux/init-first.c [PIC]: Don't use SYSDEP_CALL_INIT. Make _init a strong alias of init. The calling conventions now match. * sysdeps/generic/libc-start.c: Calling __libc_init_first has no effect for shared objects. Don't emit message and call only for static library. --- sysdeps/generic/ldsodefs.h | 9 ++++----- sysdeps/generic/libc-start.c | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) (limited to 'sysdeps/generic') diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index bcc74b3ab2..bc4ece2a7e 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -354,11 +354,10 @@ extern int _dl_check_all_versions (struct link_map *map, int verbose) extern int _dl_check_map_versions (struct link_map *map, int verbose) internal_function; -/* Return the address of the next initializer function for SCOPE or one of - its dependencies that has not yet been run. When there are no more - initializers to be run, this returns zero. The functions are returned - in the order they should be called. */ -extern ElfW(Addr) _dl_init_next (struct r_scope_elem *scope) internal_function; +/* Initialize the object in SCOPE by calling the constructors with + ARGC, ARGV, and ENV as the parameters. */ +extern void _dl_init (struct link_map *main_map, int argc, char **argv, + char **env) internal_function; /* Call the finalizer functions of all shared objects whose initializer functions have completed. */ diff --git a/sysdeps/generic/libc-start.c b/sysdeps/generic/libc-start.c index bcb3cf3f2d..e3960ca818 100644 --- a/sysdeps/generic/libc-start.c +++ b/sysdeps/generic/libc-start.c @@ -63,12 +63,12 @@ __libc_start_main (int (*main) (int, char **, char **), int argc, if (rtld_fini != NULL) atexit (rtld_fini); - /* Call the initializer of the libc. */ -#ifdef PIC - if (_dl_debug_impcalls) - _dl_debug_message (1, "\ninitialize libc\n\n", NULL); -#endif + /* 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 PIC __libc_init_first (argc, argv, __environ); +#endif /* Register the destructor of the program, if any. */ if (fini) -- cgit 1.4.1