about summary refs log tree commit diff
path: root/ldso/dynlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldso/dynlink.c')
-rw-r--r--ldso/dynlink.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index 025ed1b0..e2c3259f 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -29,6 +29,8 @@ static void error(const char *, ...);
 #define MAXP2(a,b) (-(-(a)&-(b)))
 #define ALIGN(x,y) ((x)+(y)-1 & -(y))
 
+#define container_of(p,t,m) ((t*)((char *)(p)-offsetof(t,m)))
+
 struct debug {
 	int ver;
 	void *head;
@@ -1356,7 +1358,8 @@ static void install_new_tls(void)
 {
 	sigset_t set;
 	pthread_t self = __pthread_self(), td;
-	uintptr_t (*newdtv)[tls_cnt+1] = (void *)tail->new_dtv;
+	struct dso *dtv_provider = container_of(tls_tail, struct dso, tls);
+	uintptr_t (*newdtv)[tls_cnt+1] = (void *)dtv_provider->new_dtv;
 	struct dso *p;
 	size_t i, j;
 	size_t old_cnt = self->dtv[0];