rtld: properly handle root directory in load path (bug 30435)
[platform/upstream/glibc.git] / elf / tst-tls6.c
1 #include <dlfcn.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #include <link.h>
6
7
8 static int
9 do_test (void)
10 {
11   static const char modname[] = "tst-tlsmod2.so";
12   int result = 0;
13   int *foop;
14   int *foop2;
15   int (*fp) (int, int *);
16   void *h;
17   int i;
18   int modid = -1;
19
20   for (i = 0; i < 10; ++i)
21     {
22       h = dlopen (modname, RTLD_LAZY);
23       if (h == NULL)
24         {
25           printf ("cannot open '%s': %s\n", modname, dlerror ());
26           exit (1);
27         }
28
29       /* Dirty test code here: we peek into a private data structure.
30          We make sure that the module gets assigned the same ID every
31          time.  The value of the first round is used.  */
32       if (modid == -1)
33         modid = ((struct link_map *) h)->l_tls_modid;
34       else if (((struct link_map *) h)->l_tls_modid != modid)
35         {
36           printf ("round %d: modid now %zd, initially %d\n",
37                   i, ((struct link_map *) h)->l_tls_modid, modid);
38           result = 1;
39         }
40
41       foop = dlsym (h, "foo");
42       if (foop == NULL)
43         {
44           printf ("cannot get symbol 'foo': %s\n", dlerror ());
45           exit (1);
46         }
47
48       *foop = 42 + i;
49
50       fp = dlsym (h, "in_dso");
51       if (fp == NULL)
52         {
53           printf ("cannot get symbol 'in_dso': %s\n", dlerror ());
54           exit (1);
55         }
56
57       result |= fp (42 + i, foop);
58
59       foop2 = dlsym (h, "foo");
60       if (foop2 == NULL)
61         {
62           printf ("cannot get symbol 'foo' the second time: %s\n", dlerror ());
63           exit (1);
64         }
65
66       if (foop != foop2)
67         {
68           puts ("address of 'foo' different the second time");
69           result = 1;
70         }
71       else if (*foop != 16)
72         {
73           puts ("foo != 16");
74           result = 1;
75         }
76
77       dlclose (h);
78     }
79
80   return result;
81 }
82
83
84 #include <support/test-driver.c>