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