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
main(void)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 }
110