1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <dlfcn.h>
21: #include <error.h>
22: #include <errno.h>
23: #include <stdio.h>
24: #include <stdlib.h>
25:
26:
27: static void *
28: load (const char *name)
29: {
30: void *d = dlopen (name, RTLD_LAZY | RTLD_GLOBAL);
31: if (d == NULL)
32: error (EXIT_FAILURE, errno, "cannot load `%s'", name);
33: return d;
34: }
35:
36:
37: #define TEST_FUNCTION do_test ()
38: extern int do_test (void);
39:
40: int
41: do_test (void)
42: {
43: void *d1;
44: void *d2;
45: int (*f) (void);
46:
47: d1 = load ("glreflib1.so");
48: d2 = load ("glreflib2.so");
49:
50: f = dlsym (d2, "ref2");
51: if (f == NULL)
52: error (EXIT_FAILURE, errno, "cannot get pointer to `%s'", "ref2");
53:
54: if (f () != 42)
55: error (EXIT_FAILURE, 0, "wrong result from `%s'", "ref2");
56:
57: puts ("Correct result in first call");
58: fflush (stdout);
59:
60:
61: dlclose (d1);
62:
63: puts ("About to call the second time");
64: fflush (stdout);
65:
66:
67: if (f () != 42)
68: error (EXIT_FAILURE, 0, "wrong result from `%s' (second call)", "ref2");
69:
70: puts ("Second call succeeded!");
71: fflush (stdout);
72:
73: dlclose (d2);
74:
75: puts ("glreflib2 also closed");
76: fflush (stdout);
77:
78: return 0;
79: }
80:
81: #include "../test-skeleton.c"