(root)/
glibc-2.38/
elf/
reldep6.c
       1  #include <dlfcn.h>
       2  #include <mcheck.h>
       3  #include <stdio.h>
       4  #include <stdlib.h>
       5  
       6  typedef int (*fn)(void);
       7  #define CHUNKS 1024
       8  #define REPEAT 64
       9  
      10  int
      11  main (void)
      12  {
      13    void *h1;
      14    void *h2;
      15    fn **foopp;
      16    fn bar, baz;
      17    int i, j;
      18    int n;
      19    void *allocs[REPEAT][CHUNKS];
      20  
      21    mtrace ();
      22  
      23    /* Open the two objects.  */
      24    h1 = dlopen ("reldep6mod3.so", RTLD_LAZY);
      25    if (h1 == NULL)
      26      {
      27        printf ("cannot open reldep6mod3.so: %s\n", dlerror ());
      28        exit (1);
      29      }
      30  
      31    foopp = dlsym (h1, "foopp");
      32    if (foopp == NULL)
      33      {
      34        printf ("cannot get address of \"foopp\": %s\n", dlerror ());
      35        exit (1);
      36      }
      37    n = (**foopp) ();
      38    if (n != 20)
      39      {
      40        printf ("(**foopp)() return %d, not return 20\n", n);
      41        exit (1);
      42      }
      43  
      44    h2 = dlopen ("reldep6mod4.so", RTLD_LAZY);
      45    if (h2 == NULL)
      46      {
      47        printf ("cannot open reldep6mod4.so: %s\n", dlerror ());
      48        exit (1);
      49      }
      50  
      51    baz = dlsym (h2, "baz");
      52    if (baz == NULL)
      53      {
      54        printf ("cannot get address of \"baz\": %s\n", dlerror ());
      55        exit (1);
      56      }
      57    if (baz () != 31)
      58      {
      59        printf ("baz() did not return 31\n");
      60        exit (1);
      61      }
      62  
      63    if (dlclose (h1) != 0)
      64      {
      65        printf ("closing h1 failed: %s\n", dlerror ());
      66        exit (1);
      67      }
      68  
      69    /* Clobber memory.  */
      70    for (i = 0; i < REPEAT; ++i)
      71      for (j = 0; j < CHUNKS; ++j)
      72        allocs[i][j] = calloc (1, j + 1);
      73  
      74    bar = dlsym (h2, "bar");
      75    if (bar == NULL)
      76      {
      77        printf ("cannot get address of \"bar\": %s\n", dlerror ());
      78        exit (1);
      79      }
      80    if (bar () != 40)
      81      {
      82        printf ("bar() did not return 40\n");
      83        exit (1);
      84      }
      85  
      86    baz = dlsym (h2, "baz");
      87    if (baz == NULL)
      88      {
      89        printf ("cannot get address of \"baz\": %s\n", dlerror ());
      90        exit (1);
      91      }
      92    if (baz () != 31)
      93      {
      94        printf ("baz() did not return 31\n");
      95        exit (1);
      96      }
      97  
      98    for (i = 0; i < REPEAT; ++i)
      99      for (j = 0; j < CHUNKS; ++j)
     100        free (allocs[i][j]);
     101  
     102    if (dlclose (h2) != 0)
     103      {
     104        printf ("closing h2 failed: %s\n", dlerror ());
     105        exit (1);
     106      }
     107  
     108    return 0;
     109  }