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
main()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