(root)/
glibc-2.38/
elf/
tst-tls7.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-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 (modname, RTLD_LAZY);
      21        if (h == NULL)
      22  	{
      23  	  printf ("cannot open '%s': %s\n", modname, dlerror ());
      24  	  exit (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 ("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 (h, "in_dso2");
      40        if (fp == NULL)
      41  	{
      42  	  printf ("cannot get symbol 'in_dso2': %s\n", dlerror ());
      43  	  exit (1);
      44  	}
      45  
      46        result |= fp ();
      47  
      48        dlclose (h);
      49      }
      50  
      51    return result;
      52  }
      53  
      54  
      55  #include <support/test-driver.c>