| #include <dlfcn.h> | 
 | #include <stdio.h> | 
 |  | 
 | static int | 
 | do_test (void) | 
 | { | 
 |   void *h = dlopen ("tst-tlsmod16a.so", RTLD_LAZY | RTLD_GLOBAL); | 
 |   if (h == NULL) | 
 |     { | 
 |       puts ("unexpectedly failed to open tst-tlsmod16a.so"); | 
 |       exit (1); | 
 |     } | 
 |  | 
 |   void *p = dlsym (h, "tlsvar"); | 
 |  | 
 |   /* This dlopen should indeed fail, because tlsvar was assigned to | 
 |      dynamic TLS, and the new module requests it to be in static TLS. | 
 |      However, there's a possibility that dlopen succeeds if the | 
 |      variable is, for whatever reason, assigned to static TLS, or if | 
 |      the module fails to require static TLS, or even if TLS is not | 
 |      supported.  */ | 
 |   h = dlopen ("tst-tlsmod16b.so", RTLD_NOW | RTLD_GLOBAL); | 
 |   if (h == NULL) | 
 |     { | 
 |       return 0; | 
 |     } | 
 |  | 
 |   puts ("unexpectedly succeeded to open tst-tlsmod16b.so"); | 
 |  | 
 |  | 
 |   void *(*fp) (void) = (void *(*) (void)) dlsym (h, "in_dso"); | 
 |   if (fp == NULL) | 
 |     { | 
 |       puts ("cannot find in_dso"); | 
 |       exit (1); | 
 |     } | 
 |  | 
 |   /* If the dlopen passes, at least make sure the address returned by | 
 |      dlsym is the same as that returned by the initial-exec access. | 
 |      If the variable was assigned to dynamic TLS during dlsym, this | 
 |      portion will fail.  */ | 
 |   if (fp () != p) | 
 |     { | 
 |       puts ("returned values do not match"); | 
 |       exit (1); | 
 |     } | 
 |  | 
 |   return 0; | 
 | } | 
 |  | 
 | #define TEST_FUNCTION do_test () | 
 | #include "../test-skeleton.c" |