1 | #include <dlfcn.h> |
2 | #include <stdio.h> |
3 | |
4 | int |
5 | main (void) |
6 | { |
7 | void *g = dlopen (file: "unload3mod1.so" , RTLD_GLOBAL | RTLD_NOW); |
8 | void *h = dlopen (file: "unload3mod2.so" , RTLD_GLOBAL | RTLD_NOW); |
9 | if (g == NULL || h == NULL) |
10 | { |
11 | printf (format: "dlopen unload3mod{1,2}.so failed: %p %p\n" , g, h); |
12 | return 1; |
13 | } |
14 | dlopen (file: "unload3mod4.so" , RTLD_GLOBAL | RTLD_NOW); |
15 | dlclose (handle: h); |
16 | dlclose (handle: g); |
17 | |
18 | g = dlopen (file: "unload3mod3.so" , RTLD_GLOBAL | RTLD_NOW); |
19 | h = dlopen (file: "unload3mod4.so" , RTLD_GLOBAL | RTLD_NOW); |
20 | if (g == NULL || h == NULL) |
21 | { |
22 | printf (format: "dlopen unload3mod{3,4}.so failed: %p %p\n" , g, h); |
23 | return 1; |
24 | } |
25 | |
26 | int (*fn) (int); |
27 | fn = dlsym (handle: h, name: "bar" ); |
28 | if (fn == NULL) |
29 | { |
30 | puts (s: "dlsym failed" ); |
31 | return 1; |
32 | } |
33 | |
34 | int val = fn (16); |
35 | if (val != 24) |
36 | { |
37 | printf (format: "bar returned %d != 24\n" , val); |
38 | return 1; |
39 | } |
40 | |
41 | return 0; |
42 | } |
43 | |