diff --git a/ChangeLog b/ChangeLog index 790c44ce67..366482af62 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2001-01-11 H.J. Lu + + * elf/dl-libc.c (do_dlopen): Move DL_STATIC_INIT to ... + * elf/dl-open.c (_dl_open): Here. + * sysdeps/unix/sysv/linux/ia64/dl-static.c (_dl_static_lock): + Make it static. + (_dl_static_init): Initialize the variables every time when possible. + * sysdeps/unix/sysv/linux/ia64/ldsodefs.h (DL_STATIC_INIT): + Undefine it first. + 2001-01-11 Ulrich Drepper * stdlib/Makefile (routines): Add cxa_on_exit. diff --git a/elf/dl-libc.c b/elf/dl-libc.c index 913a516f37..93ee9b7736 100644 --- a/elf/dl-libc.c +++ b/elf/dl-libc.c @@ -76,10 +76,6 @@ do_dlopen (void *ptr) struct do_dlopen_args *args = (struct do_dlopen_args *) ptr; /* Open and relocate the shared object. */ args->map = _dl_open (args->name, RTLD_LAZY, NULL); - -#ifndef SHARED - DL_STATIC_INIT (args->map); -#endif } static void diff --git a/elf/dl-open.c b/elf/dl-open.c index 0170d1c0fb..b8d28f826f 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -430,6 +430,10 @@ _dl_open (const char *file, int mode, const void *caller) _dl_signal_error (errcode, objname, local_errstring); } +#ifndef SHARED + DL_STATIC_INIT (args.map); +#endif + return args.map; } diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 0c258e3955..36ad0c6628 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,12 @@ +2001-01-11 Ulrich Drepper + + * pthread.c (pthread_initialize): Use __cxs_on_exit not __cxa_atexit. + +2001-01-11 Jakub Jelinek + + * Makefile (tests): Add ex15. + * Examples/ex15.c: New test. + 2001-01-08 Ulrich Drepper * pthread.c (pthread_exit_process): Free memory allocated for diff --git a/sysdeps/unix/sysv/linux/ia64/dl-static.c b/sysdeps/unix/sysv/linux/ia64/dl-static.c index 7d6eab8a7b..19cb97d675 100644 --- a/sysdeps/unix/sysv/linux/ia64/dl-static.c +++ b/sysdeps/unix/sysv/linux/ia64/dl-static.c @@ -40,7 +40,7 @@ _dl_var_init (void *array[]) #else #include -__libc_lock_define_initialized_recursive (, _dl_static_lock) +__libc_lock_define_initialized_recursive (static, _dl_static_lock) static void *variables[] = { @@ -54,22 +54,16 @@ _dl_static_init (struct link_map *map) const ElfW(Sym) *ref; lookup_t loadbase; void (*f) (void *[]); - static int done = 0; __libc_lock_lock (_dl_static_lock); - if (done) - { - __libc_lock_unlock (_dl_static_lock); - return; - } - - done = 1; - loadbase = _dl_lookup_symbol ("_dl_var_init", map, &ref, map->l_local_scope, 0, 1); - f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref); - f (variables); + if (ref != NULL) + { + f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref); + f (variables); + } __libc_lock_unlock (_dl_static_lock); } diff --git a/sysdeps/unix/sysv/linux/ia64/ldsodefs.h b/sysdeps/unix/sysv/linux/ia64/ldsodefs.h index 2c74a07619..34fb9e886c 100644 --- a/sysdeps/unix/sysv/linux/ia64/ldsodefs.h +++ b/sysdeps/unix/sysv/linux/ia64/ldsodefs.h @@ -27,6 +27,7 @@ /* We need special support to initialize DSO loaded for statically linked binaries. */ extern void _dl_static_init (struct link_map *map); +#undef DL_STATIC_INIT #define DL_STATIC_INIT(map) _dl_static_init (map) #endif /* ldsodefs.h */