diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/env/__init_tls.c | 2 | ||||
| -rw-r--r-- | src/internal/pthread_impl.h | 1 | ||||
| -rw-r--r-- | src/ldso/dynlink.c | 6 | 
3 files changed, 5 insertions, 4 deletions
| diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c index b0dad429..e651c7a7 100644 --- a/src/env/__init_tls.c +++ b/src/env/__init_tls.c @@ -54,7 +54,7 @@ void *__copy_tls(unsigned char *mem)  	td = (pthread_t)mem;  	mem -= T.size;  #endif -	td->dtv = dtv; +	td->dtv = td->dtv_copy = dtv;  	dtv[1] = mem;  	memcpy(mem, T.image, T.len);  	return td; diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index 441b075f..7c352bc4 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -45,6 +45,7 @@ struct pthread {  	volatile int startlock[2];  	unsigned long sigmask[_NSIG/8/sizeof(long)];  	void *stdio_locks; +	void **dtv_copy;  };  struct __timer { diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index ca101993..b0d5ff46 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -1015,7 +1015,7 @@ void *__copy_tls(unsigned char *mem)  	dtv[0] = (void *)tls_cnt;  	if (!tls_cnt) {  		td = (void *)(dtv+1); -		td->dtv = dtv; +		td->dtv = td->dtv_copy = dtv;  		return td;  	} @@ -1041,7 +1041,7 @@ void *__copy_tls(unsigned char *mem)  		memcpy(dtv[p->tls_id], p->tls_image, p->tls_len);  	}  #endif -	td->dtv = dtv; +	td->dtv = td->dtv_copy = dtv;  	return td;  } @@ -1071,7 +1071,7 @@ void *__tls_get_new(size_t *v)  		memcpy(newdtv, self->dtv,  			((size_t)self->dtv[0]+1) * sizeof(void *));  		newdtv[0] = (void *)v[0]; -		self->dtv = newdtv; +		self->dtv = self->dtv_copy = newdtv;  	}  	/* Get new TLS memory from all new DSOs up to the requested one */ | 
