diff options
Diffstat (limited to 'src/env/__init_tls.c')
-rw-r--r-- | src/env/__init_tls.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c index 96d0e284..842886f6 100644 --- a/src/env/__init_tls.c +++ b/src/env/__init_tls.c @@ -36,32 +36,32 @@ void *__copy_tls(unsigned char *mem) pthread_t td; struct tls_module *p; size_t i; - void **dtv; + uintptr_t *dtv; #ifdef TLS_ABOVE_TP - dtv = (void **)(mem + libc.tls_size) - (libc.tls_cnt + 1); + dtv = (uintptr_t*)(mem + libc.tls_size) - (libc.tls_cnt + 1); mem += -((uintptr_t)mem + sizeof(struct pthread)) & (libc.tls_align-1); td = (pthread_t)mem; mem += sizeof(struct pthread); for (i=1, p=libc.tls_head; p; i++, p=p->next) { - dtv[i] = mem + p->offset; - memcpy(dtv[i], p->image, p->len); + dtv[i] = (uintptr_t)(mem + p->offset) + DTP_OFFSET; + memcpy(mem + p->offset, p->image, p->len); } #else - dtv = (void **)mem; + dtv = (uintptr_t *)mem; mem += libc.tls_size - sizeof(struct pthread); mem -= (uintptr_t)mem & (libc.tls_align-1); td = (pthread_t)mem; for (i=1, p=libc.tls_head; p; i++, p=p->next) { - dtv[i] = mem - p->offset; - memcpy(dtv[i], p->image, p->len); + dtv[i] = (uintptr_t)(mem - p->offset) + DTP_OFFSET; + memcpy(mem - p->offset, p->image, p->len); } #endif - dtv[0] = (void *)libc.tls_cnt; + dtv[0] = libc.tls_cnt; td->dtv = td->dtv_copy = dtv; return td; } |