1#include <dlfcn.h>
2#include <stdio.h>
3#include <string.h>
4#include <gnu/lib-names.h>
5#include <ldsodefs.h>
6
7
8static int
9do_test (void)
10{
11 int result = 0;
12
13 for (int i = 1; i <= 10; ++i)
14 {
15 void *h[DL_NNS - 1];
16 char used[DL_NNS];
17
18 printf (format: "round %d\n", i);
19
20 memset (s: used, c: '\0', n: sizeof (used));
21 used[LM_ID_BASE] = 1;
22
23 for (int j = 0; j < DL_NNS - 1; ++j)
24 {
25 h[j] = dlmopen (LM_ID_NEWLM, file: "$ORIGIN/tst-dlmopen1mod.so",
26 RTLD_LAZY);
27 if (h[j] == NULL)
28 {
29 printf (format: "round %d, namespace %d: load failed: %s\n",
30 i, j, dlerror ());
31 return 1;
32 }
33 Lmid_t ns;
34 if (dlinfo (handle: h[j], request: RTLD_DI_LMID, arg: &ns) != 0)
35 {
36 printf (format: "round %d, namespace %d: dlinfo failed: %s\n",
37 i, j, dlerror ());
38 return 1;
39 }
40 if (ns < 0 || ns >= DL_NNS)
41 {
42 printf (format: "round %d, namespace %d: invalid namespace %ld",
43 i, j, (long int) ns);
44 result = 1;
45 }
46 else if (used[ns] != 0)
47 {
48 printf (format: "\
49round %d, namespace %d: duplicate allocate of namespace %ld",
50 i, j, (long int) ns);
51 result = 1;
52 }
53 else
54 used[ns] = 1;
55 }
56
57 for (int j = 0; j < DL_NNS - 1; ++j)
58 if (dlclose (handle: h[j]) != 0)
59 {
60 printf (format: "round %d, namespace %d: close failed: %s\n",
61 i, j, dlerror ());
62 return 1;
63 }
64 }
65
66 return result;
67}
68
69#include <support/test-driver.c>
70

source code of glibc/elf/tst-dlmopen2.c