From a21a20a33f5b49cfc06ed72f3164099ce226a0b9 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 15 Oct 2003 06:24:26 +0000 Subject: Update. 2003-10-15 Jakub Jelinek * elf/rtld.c (print_statistics): Print also number of relative relocations. --- ChangeLog | 5 +++++ elf/rtld.c | 20 ++++++++++++++++++++ linuxthreads/ChangeLog | 6 ++++++ linuxthreads/manager.c | 5 +++++ linuxthreads/pthread.c | 15 +++++++++++++++ 5 files changed, 51 insertions(+) diff --git a/ChangeLog b/ChangeLog index 0408233170..9263b3eec1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-10-15 Jakub Jelinek + + * elf/rtld.c (print_statistics): Print also number of relative + relocations. + 2003-10-12 Carlos O'Donell * sysdeps/hppa/sysdep.h: Undef JUMPTARGET before use. diff --git a/elf/rtld.c b/elf/rtld.c index 4f22a625ed..7c4d961dbd 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -2120,10 +2120,30 @@ print_statistics (void) buf, pbuf); } #endif + + unsigned long int num_relative_relocations = 0; + struct r_scope_elem *scope = &GL(dl_loaded)->l_searchlist; + unsigned int i; + + for (i = 0; i < scope->r_nlist; i++) + { + struct link_map *l = scope->r_list [i]; + + if (!l->l_addr) + continue; + + if (l->l_info[VERSYMIDX (DT_RELCOUNT)]) + num_relative_relocations += l->l_info[VERSYMIDX (DT_RELCOUNT)]->d_un.d_val; + if (l->l_info[VERSYMIDX (DT_RELACOUNT)]) + num_relative_relocations += l->l_info[VERSYMIDX (DT_RELACOUNT)]->d_un.d_val; + } + INTUSE(_dl_debug_printf) (" number of relocations: %lu\n", GL(dl_num_relocations)); INTUSE(_dl_debug_printf) (" number of relocations from cache: %lu\n", GL(dl_num_cache_relocations)); + INTUSE(_dl_debug_printf) (" number of relative relocations: %lu\n", + num_relative_relocations); #ifndef HP_TIMING_NONAVAIL /* Time spend while loading the object and the dependencies. */ diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index a7e0b46daf..3102111eff 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,9 @@ +2003-10-06 Carlos O'Donell + + * pthread.c (__pthread_self_stack): _STACK_GROWS_UP case added. + (__pthread_find_self): Likewise. + * manager.c (thread_segment): _STACK_GROWS_UP case added. + 2003-10-10 Carlos O'Donell * linuxthreads/sysdeps/unix/sysv/linux/hppa/malloc-machine.h: New file. diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c index f8647b47ca..462ce4a0d4 100644 --- a/linuxthreads/manager.c +++ b/linuxthreads/manager.c @@ -70,8 +70,13 @@ static pthread_descr manager_thread; #else static inline pthread_descr thread_segment(int seg) { +# ifdef _STACK_GROWS_UP + return (pthread_descr)(THREAD_STACK_START_ADDRESS + (seg - 1) * STACK_SIZE) + + 1; +# else return (pthread_descr)(THREAD_STACK_START_ADDRESS - (seg - 1) * STACK_SIZE) - 1; +# endif } #endif diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c index b3953542e0..11d2ef7dd1 100644 --- a/linuxthreads/pthread.c +++ b/linuxthreads/pthread.c @@ -893,7 +893,11 @@ pthread_descr __pthread_find_self(void) /* __pthread_handles[0] is the initial thread, __pthread_handles[1] is the manager threads handled specially in thread_self(), so start at 2 */ h = __pthread_handles + 2; +# ifdef _STACK_GROWS_UP + while (! (sp >= (char *) h->h_descr && sp < h->h_descr->p_guardaddr)) h++; +# else while (! (sp <= (char *) h->h_descr && sp >= h->h_bottom)) h++; +# endif return h->h_descr; } @@ -908,12 +912,23 @@ pthread_descr __pthread_self_stack(void) return manager_thread; h = __pthread_handles + 2; # ifdef USE_TLS +# ifdef _STACK_GROWS_UP + while (h->h_descr == NULL + || ! (sp >= h->h_descr->p_stackaddr && sp < h->h_descr->p_guardaddr)) + h++; +# else while (h->h_descr == NULL || ! (sp <= (char *) h->h_descr->p_stackaddr && sp >= h->h_bottom)) h++; +# endif # else +# ifdef _STACK_GROWS_UP + while (! (sp >= (char *) h->h_descr && sp < h->h_descr->p_guardaddr)) + h++; +# else while (! (sp <= (char *) h->h_descr && sp >= h->h_bottom)) h++; +# endif # endif return h->h_descr; } -- cgit v1.2.3