#include #include #include #include __thread int my_int; bool go = false; extern "C" void* run(void* obj) { int *(*get_ext_tls)() = (int*(*)()) dlsym(obj, "get_ext_int"); int *(*get_my_tls)() = (int*(*)()) dlsym(obj, "get_my_int"); int *ext_int = (int*) dlsym(obj, "ext_int"); int *my_tls = get_my_tls(); int *ext_tls = get_ext_tls(); while(not go) usleep(100*1000); printf("tid=%x, &my_int=%p, &my_tls=%p, &ext_int=%p, &ext_tls=%p\n", (int)pthread_self(), &my_int, my_tls, ext_int, ext_tls); return 0; } int main() { void* obj = dlopen("ext-tls", 0); if (not obj) fprintf(stderr, "Unable to open dll: %s\n", dlerror()); pthread_t tids[10]; for(unsigned i=0; i < sizeof(tids)/sizeof(*tids); i++) pthread_create(&tids[i], 0, &run, obj); fprintf(stderr, "pid: %d\n", getpid()); sleep(1); go = true; run(obj); for(unsigned i=0; i < sizeof(tids)/sizeof(*tids); i++) pthread_join(tids[i], 0); }