1 // __tls_get_new did not allocate new dtv for threads properly 2 #include <pthread.h> 3 #include <dlfcn.h> 4 #include "test.h" 5 6 #define N 10 7 8 #define T(c) ((c) || (t_error(#c " failed\n"),0)) 9 10 static pthread_barrier_t b; 11 static void *mod; 12 start(void * a)13static void *start(void *a) 14 { 15 void *(*f)(void); 16 17 pthread_barrier_wait(&b); 18 T(f = dlsym(mod, "f")); 19 f(); 20 return 0; 21 } 22 main()23int main() 24 { 25 pthread_t td[N]; 26 int i; 27 28 pthread_barrier_init(&b, 0, N+1); 29 for (i=0; i<N; i++) 30 T(!pthread_create(td+i, 0, start, 0)); 31 32 T(mod = dlopen("libtls_get_new-dtv_dso.so", RTLD_NOW)); 33 pthread_barrier_wait(&b); 34 35 for (i=0; i<N; i++) 36 T(!pthread_join(td[i], 0)); 37 return t_status; 38 } 39