1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #include <dlfcn.h>
20: #include <stdio.h>
21: #include <stdlib.h>
22:
23: extern void *__dso_handle __attribute__ ((__weak__));
24:
25: int
26: main (void)
27: {
28: const char fname[] = "modcxaatexit.so";
29: void *h;
30: void (*fp) (void *);
31: int v = 0;
32:
33: if (&__dso_handle == NULL)
34: {
35: puts ("__dso_handle not available, cannot perform the test");
36: exit (0);
37: }
38:
39: h = dlopen (fname, RTLD_LAZY);
40: if (h == NULL)
41: {
42: printf ("cannot open \"%s\": %s\n", fname, dlerror ());
43: exit (1);
44: }
45:
46: fp = dlsym (h, "bar");
47: if (fp == NULL)
48: {
49: printf ("cannot find \"bar\": %s\n", dlerror ());
50: exit (1);
51: }
52:
53: fp (&v);
54:
55: if (dlclose (h) != 0)
56: {
57: printf ("cannot close \"%s\": %s\n", fname, dlerror ());
58: exit (1);
59: }
60:
61: if (v != 1)
62: {
63: puts ("module unload didn't change `v'");
64: exit (1);
65: }
66:
67: puts ("finishing now");
68:
69: return 0;
70: }