1 /* 2 * Public Domain 2003 Dale Rahn 3 * 4 * $OpenBSD: prog1.C,v 1.4 2005/09/19 18:39:38 deraadt Exp $ 5 */ 6 #include <iostream> 7 #include <dlfcn.h> 8 #include <string.h> 9 #include <stdio.h> 10 typedef char * (cp_func)(void); 11 int a; 12 int 13 main() 14 { 15 void *handle1; 16 void *handle2; 17 char **libname; 18 char *str; 19 cp_func *func; 20 int ret = 0; 21 22 std::cout << "main\n"; 23 handle1 = dlopen("libaa.so.0.0", DL_LAZY); 24 if (handle1 == NULL) { 25 std::cout << "handle1 open libaa failed\n"; 26 return (1); 27 } 28 handle2 = dlopen("libab.so.0.0", DL_LAZY); 29 if (handle2 == NULL) { 30 std::cout << "handle2 open libab failed\n"; 31 return (1); 32 } 33 34 libname = (char **)dlsym(handle1, "libname"); 35 if (strcmp(*libname, "libaa") != 0) { 36 std::cout << "handle1 is " << *libname << "\n"; 37 return (1); 38 } 39 40 libname = (char **)dlsym(handle2, "libname"); 41 if (strcmp(*libname, "libab") != 0) { 42 std::cout << "handle2 is " << *libname << "\n"; 43 return (1); 44 } 45 46 func = (cp_func*)dlsym(handle1, "lib_entry"); 47 str = (*func)(); 48 if (strcmp(str, "libaa:aa") != 0) { 49 printf("func should have returned libaa:aa returned %s\n", str); 50 ret = 1; 51 } 52 53 func = (cp_func*)dlsym(handle2, "lib_entry"); 54 str = (*func)(); 55 if (strcmp(str, "libab:ab") != 0) { 56 printf("func should have returned libab:ab returned %s\n", str); 57 ret = 1; 58 } 59 60 dlclose(handle1); 61 dlclose(handle2); 62 63 return ret; 64 } 65