1#include <dlfcn.h>
2#include <stdio.h>
3#include <stdlib.h>
4
5#include <link.h>
6
7
8static int
9do_test (void)
10{
11 static const char modname[] = "tst-tlsmod3.so";
12 int result = 0;
13 int (*fp) (void);
14 void *h;
15 int i;
16 int modid = -1;
17
18 for (i = 0; i < 10; ++i)
19 {
20 h = dlopen (file: modname, RTLD_LAZY);
21 if (h == NULL)
22 {
23 printf (format: "cannot open '%s': %s\n", modname, dlerror ());
24 exit (status: 1);
25 }
26
27 /* Dirty test code here: we peek into a private data structure.
28 We make sure that the module gets assigned the same ID every
29 time. The value of the first round is used. */
30 if (modid == -1)
31 modid = ((struct link_map *) h)->l_tls_modid;
32 else if (((struct link_map *) h)->l_tls_modid != (size_t) modid)
33 {
34 printf (format: "round %d: modid now %zu, initially %d\n",
35 i, ((struct link_map *) h)->l_tls_modid, modid);
36 result = 1;
37 }
38
39 fp = dlsym (handle: h, name: "in_dso2");
40 if (fp == NULL)
41 {
42 printf (format: "cannot get symbol 'in_dso2': %s\n", dlerror ());
43 exit (status: 1);
44 }
45
46 result |= fp ();
47
48 dlclose (handle: h);
49 }
50
51 return result;
52}
53
54
55#include <support/test-driver.c>
56

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