fix omission of dtv setup in static linked programs on TLS variant I archs
authorRich Felker <dalias@aerifal.cx>
Sat, 13 Jul 2013 18:54:34 +0000 (14:54 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 13 Jul 2013 18:54:34 +0000 (14:54 -0400)
apparently this was never noticed before because the linker normally
optimizes dynamic TLS models to non-dynamic ones when static linking,
thus eliminating the calls to __tls_get_addr which crash when the dtv
is missing. however, some libsupc++ code on ARM was calling
__tls_get_addr when static linked and crashing. the reason is unclear
to me, but with this issue fixed it should work now anyway.

src/env/__init_tls.c

index eb2a6e4..a4704f0 100644 (file)
@@ -26,9 +26,9 @@ void *__copy_tls(unsigned char *mem)
        mem += libc.tls_size - sizeof(struct pthread);
        mem -= (uintptr_t)mem & (align-1);
        td = (pthread_t)mem;
-       td->dtv = dtv;
        mem -= size;
 #endif
+       td->dtv = dtv;
        dtv[1] = mem;
        memcpy(mem, image, len);
        return td;