diff --git a/ChangeLog b/ChangeLog index 96ba5b89f2..7ed139d0fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2000-05-05 Ulrich Drepper + * elf/Makefile (distribute): Add dl-lookupcfg.h. + * sysdeps/ia64/Dist: New file. + * elf/dl-load.c (_dl_map_object_from_fd): Little of computation of parameter to mprotect and for variable assignments. diff --git a/elf/Makefile b/elf/Makefile index fc7ce789d1..da266b825c 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -39,7 +39,7 @@ distribute := $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \ dl-cache.h dl-hash.h soinit.c sofini.c ldd.bash.in \ genrtldtbl.awk atomicity.h dl-procinfo.h ldsodefs.h \ dl-librecon.h interp.c sln.c dl-dst.h hp-timing.h \ - do-lookup.h sprof.c gen-trusted-dirs.awk \ + do-lookup.h dl-lookupcfg.h sprof.c gen-trusted-dirs.awk \ testobj1.c testobj2.c testobj3.c testobj4.c testobj5.c \ testobj6.c testobj1_1.c failobj.c \ ldconfig.h ldconfig.c cache.c readlib.c readelflib.c \ diff --git a/elf/dl-load.c b/elf/dl-load.c index f5d91ba6c7..10698ce045 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -922,17 +922,17 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname, - MAP_BASE_ADDR (l)); /* Remember which part of the address space this object uses. */ - l->l_map_start = map_segment (mappref, maplength, c->prot, 0, - c->mapoff); + l->l_map_start = (ElfW(Addr)) map_segment (mappref, maplength, c->prot, + 0, c->mapoff); l->l_map_end = l->l_map_start + maplength; - l->l_addr = (ElfW(Addr)) mapat - c->mapstart; + l->l_addr = l->l_map_start - c->mapstart; /* Change protection on the excess portion to disallow all access; the portions we do not remap later will be inaccessible as if unallocated. Then jump into the normal segment-mapping loop to handle the portion of the segment past the end of the file mapping. */ - __mprotect ((caddr_t) l->l_map_start, + __mprotect ((caddr_t) (l->l_addr + c->mapend), loadcmds[nloadcmds - 1].allocend - c->mapend, 0); diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 6072abc81c..b4f33434b1 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,4 +1,14 @@ -2000-04-29 Bruno Haible +2000-05-05 Ulrich Drepper + + * internals.h (struct _pthread_descr_struct): Reorganization. + Allocate room for 16 pointers at head of the structure for future + thread-local data handling. Move p_self member in this area. + * manager.c (pthread_handle_create): Adjust use of p_self. + * sysdeps/i386/useldt.h (THREAD_SELF): Likewise. + * pthread.c (__pthread_initial_thread): Adjust initialization. + (__pthread_manager_thread): Likewise. + +2000-04-29 Bruno Haible * join.c (pthread_exit): Use THREAD_GETMEM_NC instead of THREAD_GETMEM for eventmask larger than 1 word. diff --git a/linuxthreads/internals.h b/linuxthreads/internals.h index 079bf2cd64..b257be0279 100644 --- a/linuxthreads/internals.h +++ b/linuxthreads/internals.h @@ -124,6 +124,12 @@ typedef struct _pthread_rwlock_info { } pthread_readlock_info; struct _pthread_descr_struct { + union { + struct { + pthread_descr self; /* Pointer to this structure */ + } data; + void *__padding[16]; + } p_header; pthread_descr p_nextlive, p_prevlive; /* Double chaining of active threads */ pthread_descr p_nextwaiting; /* Next element in the queue holding the thr */ @@ -157,7 +163,6 @@ struct _pthread_descr_struct { int p_userstack; /* nonzero if the user provided the stack */ void *p_guardaddr; /* address of guard area or NULL */ size_t p_guardsize; /* size of guard area */ - pthread_descr p_self; /* Pointer to this structure */ int p_nr; /* Index of descriptor in __pthread_handles */ int p_report_events; /* Nonzero if events must be reported. */ td_eventbuf_t p_eventbuf; /* Data for event. */ diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c index 33c791cdbb..0c781dea6e 100644 --- a/linuxthreads/manager.c +++ b/linuxthreads/manager.c @@ -385,7 +385,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, new_thread->p_resp = &new_thread->p_res; new_thread->p_guardaddr = guardaddr; new_thread->p_guardsize = guardsize; - new_thread->p_self = new_thread; + new_thread->p_header.data.self = new_thread; new_thread->p_nr = sseg; /* Initialize the thread handle */ __pthread_init_lock(&__pthread_handles[sseg].h_lock); diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c index a78e0c92de..0e713e74da 100644 --- a/linuxthreads/pthread.c +++ b/linuxthreads/pthread.c @@ -37,6 +37,11 @@ /* Descriptor of the initial thread */ struct _pthread_descr_struct __pthread_initial_thread = { + { + { + &__pthread_initial_thread /* pthread_descr self */ + } + }, &__pthread_initial_thread, /* pthread_descr p_nextlive */ &__pthread_initial_thread, /* pthread_descr p_prevlive */ NULL, /* pthread_descr p_nextwaiting */ @@ -71,7 +76,6 @@ struct _pthread_descr_struct __pthread_initial_thread = { 0, /* int p_userstack */ NULL, /* void * p_guardaddr */ 0, /* size_t p_guardsize */ - &__pthread_initial_thread, /* pthread_descr p_self */ 0, /* Always index 0 */ 0, /* int p_report_events */ {{{0, }}, 0, NULL}, /* td_eventbuf_t p_eventbuf */ @@ -88,6 +92,11 @@ struct _pthread_descr_struct __pthread_initial_thread = { and the address for identification. */ struct _pthread_descr_struct __pthread_manager_thread = { + { + { + &__pthread_manager_thread /* pthread_descr self */ + } + }, NULL, /* pthread_descr p_nextlive */ NULL, /* pthread_descr p_prevlive */ NULL, /* pthread_descr p_nextwaiting */ @@ -122,7 +131,6 @@ struct _pthread_descr_struct __pthread_manager_thread = { 0, /* int p_userstack */ NULL, /* void * p_guardaddr */ 0, /* size_t p_guardsize */ - &__pthread_manager_thread, /* pthread_descr p_self */ 1, /* Always index 1 */ 0, /* int p_report_events */ {{{0, }}, 0, NULL}, /* td_eventbuf_t p_eventbuf */ @@ -369,12 +377,12 @@ static void pthread_initialize(void) sa.sa_flags = 0; __sigaction(__pthread_sig_restart, &sa, NULL); sa.sa_handler = pthread_handle_sigcancel; - sa.sa_flags = 0; + // sa.sa_flags = 0; __sigaction(__pthread_sig_cancel, &sa, NULL); if (__pthread_sig_debug > 0) { sa.sa_handler = pthread_handle_sigdebug; sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; + // sa.sa_flags = 0; __sigaction(__pthread_sig_debug, &sa, NULL); } /* Initially, block __pthread_sig_restart. Will be unblocked on demand. */ diff --git a/linuxthreads/sysdeps/i386/useldt.h b/linuxthreads/sysdeps/i386/useldt.h index e6055e0128..bd527a3d3c 100644 --- a/linuxthreads/sysdeps/i386/useldt.h +++ b/linuxthreads/sysdeps/i386/useldt.h @@ -54,7 +54,8 @@ extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t); ({ \ register pthread_descr __self; \ __asm__ ("movl %%gs:%c1,%0" : "=r" (__self) \ - : "i" (offsetof (struct _pthread_descr_struct, p_self))); \ + : "i" (offsetof (struct _pthread_descr_struct, \ + p_header.data.self))); \ __self; \ }) diff --git a/sysdeps/ia64/Dist b/sysdeps/ia64/Dist new file mode 100644 index 0000000000..9fc1de291a --- /dev/null +++ b/sysdeps/ia64/Dist @@ -0,0 +1,2 @@ +dl-symaddr.c +dl-fptr.c