| #include <dlfcn.h> |
| #include <error.h> |
| #include <mcheck.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| int |
| main (void) |
| { |
| void *h1; |
| int (*fp1) (int); |
| void *h2; |
| int (*fp2) (int); |
| int res1; |
| int res2; |
| |
| mtrace (); |
| |
| h1 = dlopen ("testobj1.so", RTLD_LAZY); |
| if (h1 == NULL) |
| error (EXIT_FAILURE, 0, "while loading `%s': %s", "testobj1.so", |
| dlerror ()); |
| |
| h2 = dlopen ("testobj1_1.so", RTLD_LAZY); |
| if (h1 == NULL) |
| error (EXIT_FAILURE, 0, "while loading `%s': %s", "testobj1_1.so", |
| dlerror ()); |
| |
| fp1 = dlsym (h1, "obj1func1"); |
| if (fp1 == NULL) |
| error (EXIT_FAILURE, 0, "getting `obj1func1' in `%s': %s", |
| "testobj1.so", dlerror ()); |
| |
| fp2 = dlsym (h2, "obj1func1"); |
| if (fp2 == NULL) |
| error (EXIT_FAILURE, 0, "getting `obj1func1' in `%s': %s", |
| "testobj1_1.so", dlerror ()); |
| |
| res1 = fp1 (10); |
| res2 = fp2 (10); |
| printf ("fp1(10) = %d\nfp2(10) = %d\n", res1, res2); |
| |
| if (dlclose (h1) != 0) |
| error (EXIT_FAILURE, 0, "cannot close testobj1.so: %s\n", dlerror ()); |
| if (dlclose (h2) != 0) |
| error (EXIT_FAILURE, 0, "cannot close testobj1_1.so: %s\n", dlerror ()); |
| |
| return res1 != 42 || res2 != 72; |
| } |
| |
| |
| extern int foo (int a); |
| int |
| foo (int a) |
| { |
| return a + 10; |
| } |