1 #include <dlfcn.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 
5 #include <link.h>
6 
7 
8 static int
do_test(void)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>
85