1 #include <dlfcn.h>
2 #include <stdio.h>
3 #include <gnu/lib-names.h>
4
5
6 static int cnt;
7
8 static void
9 __attribute ((constructor))
constr(void)10 constr (void)
11 {
12 ++cnt;
13 }
14
15
16 int
foo(Lmid_t ns2)17 foo (Lmid_t ns2)
18 {
19 void *h = dlopen (LIBC_SO, RTLD_LAZY|RTLD_NOLOAD);
20 if (h == NULL)
21 {
22 printf ("cannot get handle for %s: %s\n", LIBC_SO, dlerror ());
23 return 1;
24 }
25
26 Lmid_t ns = -10;
27 if (dlinfo (h, RTLD_DI_LMID, &ns) != 0)
28 {
29 printf ("dlinfo for %s in %s failed: %s\n",
30 LIBC_SO, __func__, dlerror ());
31 return 1;
32 }
33
34 if (ns != ns2)
35 {
36 printf ("namespace for %s not LM_ID_BASE\n", LIBC_SO);
37 return 1;
38 }
39
40 if (dlclose (h) != 0)
41 {
42 printf ("dlclose for %s in %s failed: %s\n",
43 LIBC_SO, __func__, dlerror ());
44 return 1;
45 }
46
47 if (cnt == 0)
48 {
49 puts ("constructor did not run");
50 return 1;
51 }
52 else if (cnt != 1)
53 {
54 puts ("constructor did not run exactly once");
55 return 1;
56 }
57
58 return 0;
59 }
60