| /* Check alignment of TLS variable. */ |
| #include <dlfcn.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #include <tls.h> |
| |
| #if HAVE___THREAD |
| |
| # define AL 4096 |
| struct foo |
| { |
| int i; |
| } __attribute ((aligned (AL))); |
| |
| static __thread struct foo f; |
| static struct foo g; |
| |
| |
| extern int in_dso1 (void); |
| |
| |
| static int |
| do_test (void) |
| { |
| int result = 0; |
| |
| int fail = (((uintptr_t) &f) & (AL - 1)) != 0; |
| printf ("&f = %p %s\n", &f, fail ? "FAIL" : "OK"); |
| result |= fail; |
| |
| fail = (((uintptr_t) &g) & (AL - 1)) != 0; |
| printf ("&g = %p %s\n", &g, fail ? "FAIL" : "OK"); |
| result |= fail; |
| |
| result |= in_dso1 (); |
| |
| void *h = dlopen ("tst-tlsmod14b.so", RTLD_LAZY); |
| if (h == NULL) |
| { |
| printf ("cannot open tst-tlsmod14b.so: %m\n"); |
| exit (1); |
| } |
| |
| int (*fp) (void) = (int (*) (void)) dlsym (h, "in_dso2"); |
| if (fp == NULL) |
| { |
| puts ("cannot find in_dso2"); |
| exit (1); |
| } |
| |
| result |= fp (); |
| |
| return result; |
| } |
| |
| # define TEST_FUNCTION do_test () |
| |
| #else |
| |
| # define TEST_FUNCTION 0 |
| |
| #endif |
| |
| #include "../test-skeleton.c" |