1 /*	$OpenBSD: bb.c,v 1.2 2005/09/19 21:50:27 drahn Exp $	*/
2 
3 /*
4  * Copyright (c) 2005 Kurt Miller <kurt@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <dlfcn.h>
20 #include <stdio.h>
21 
22 int bbSymbol;
23 int commonSymbol;
24 
25 /*
26  * this test is setup where the main program group dlopen's libbb and libdd
27  * without RTLD_GLOBAL. libcc is part of libbb load group. libee is part of
28  * libdd load group.
29  */
30 int
31 bbTest1(void *libbb, void *libdd)
32 {
33 	int ret = 0;
34 
35 	/* check RTLD_DEFAULT can *not* see symbols in libdd object group */
36 	if (dlsym(RTLD_DEFAULT, "ddSymbol") != NULL) {
37 		printf("dlsym(RTLD_DEFAULT, \"ddSymbol\") != NULL\n");
38 		ret = 1;
39 	}
40 
41 	/* check RTLD_SELF can *not* see symbols in libdd object group */
42 	if (dlsym(RTLD_SELF, "ddSymbol") != NULL) {
43 		printf("dlsym(RTLD_SELF, \"ddSymbol\") != NULL\n");
44 		ret = 1;
45 	}
46 
47 	/* check RTLD_NEXT can *not* see symbols in libdd object group */
48 	if (dlsym(RTLD_NEXT, "ddSymbol") != NULL) {
49 		printf("dlsym(RTLD_NEXT, \"ddSymbol\") != NULL\n");
50 		ret = 1;
51 	}
52 
53 	/* check NULL can *not* see symbols in libdd object group */
54 	if (dlsym(NULL, "ddSymbol") != NULL) {
55 		printf("dlsym(NULL, \"ddSymbol\") != NULL\n");
56 		ret = 1;
57 	}
58 
59 	/* libbb should *not* see symbols in libdd or libee */
60 	if (dlsym(libbb, "ddSymbol") != NULL) {
61 		printf("dlsym(libbb, \"ddSymbol\") != NULL\n");
62 		ret = 1;
63 	}
64 
65 	/* libdd should *not* see symbols in libbb or libcc */
66 	if (dlsym(libdd, "bbSymbol") != NULL) {
67 		printf("dlsym(libdd, \"bbSymbol\") != NULL\n");
68 		ret = 1;
69 	}
70 
71 	/* libbb should see symbols in libbb and libcc */
72 	if (dlsym(libbb, "ccSymbol") == NULL) {
73 		printf("dlsym(libbb, \"ccSymbol\") == NULL\n");
74 		ret = 1;
75 	}
76 
77 	/* libdd should see symbols in libbb and libee */
78 	if (dlsym(libdd, "eeSymbol") == NULL) {
79 		printf("dlsym(libdd, \"eeSymbol\") == NULL\n");
80 		ret = 1;
81 	}
82 
83 	return (ret);
84 }
85 
86 /*
87  * this test is setup where the main program group dlopen's libbb and libdd.
88  * libdd is opened with RTLD_GLOBAL. libcc is part of libbb load group. libee
89  * is part of libdd load group.
90  */
91 int
92 bbTest2()
93 {
94 	int ret = 0;
95 
96 	/* check RTLD_DEFAULT can see symbols in libdd object group */
97 	if (dlsym(RTLD_DEFAULT, "eeSymbol") != NULL) {
98 		printf("dlsym(RTLD_DEFAULT, \"ddSymbol\") != NULL\n");
99 		ret = 1;
100 	}
101 
102 	/* check RTLD_SELF can see symbols in libdd object group */
103 	if (dlsym(RTLD_SELF, "eeSymbol") != NULL) {
104 		printf("dlsym(RTLD_SELF, \"ddSymbol\") != NULL\n");
105 		ret = 1;
106 	}
107 
108 	/* check RTLD_NEXT can see symbols in libdd object group */
109 	if (dlsym(RTLD_NEXT, "eeSymbol") != NULL) {
110 		printf("dlsym(RTLD_NEXT, \"ddSymbol\") != NULL\n");
111 		ret = 1;
112 	}
113 
114 	return (ret);
115 }
116