| #include <dlfcn.h> |
| #include <stdio.h> |
| #include <gnu/lib-names.h> |
| |
| |
| static int cnt; |
| |
| static void |
| __attribute ((constructor)) |
| constr (void) |
| { |
| ++cnt; |
| } |
| |
| |
| int |
| foo (Lmid_t ns2) |
| { |
| void *h = dlopen (LIBC_SO, RTLD_LAZY|RTLD_NOLOAD); |
| if (h == NULL) |
| { |
| printf ("cannot get handle for %s: %s\n", LIBC_SO, dlerror ()); |
| return 1; |
| } |
| |
| Lmid_t ns = -10; |
| if (dlinfo (h, RTLD_DI_LMID, &ns) != 0) |
| { |
| printf ("dlinfo for %s in %s failed: %s\n", |
| LIBC_SO, __func__, dlerror ()); |
| return 1; |
| } |
| |
| if (ns != ns2) |
| { |
| printf ("namespace for %s not LM_ID_BASE\n", LIBC_SO); |
| return 1; |
| } |
| |
| if (dlclose (h) != 0) |
| { |
| printf ("dlclose for %s in %s failed: %s\n", |
| LIBC_SO, __func__, dlerror ()); |
| return 1; |
| } |
| |
| if (cnt == 0) |
| { |
| puts ("constructor did not run"); |
| return 1; |
| } |
| else if (cnt != 1) |
| { |
| puts ("constructor did not run exactly once"); |
| return 1; |
| } |
| |
| return 0; |
| } |