1 /*	$OpenBSD: aa.c,v 1.3 2005/09/16 23:30:25 kurt 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 
20 #include <dlfcn.h>
21 #include <stdio.h>
22 #include "aa.h"
23 
24 int aaSymbol;
25 
26 void
27 sigprocmask() {
28 }
29 
30 /*
31  * aaTest verifies dlsym works as expected with a simple case of duplicate
32  * symbols. prog1, libaa and libc all have the sigprocmask symbol and are
33  * linked with prog1 with libaa before libc. Depending on how dlsym is called
34  * the symbol for sigprocmask should come from prog1, libaa or libc.
35  */
36 int
37 aaTest()
38 {
39 	int ret = 0;
40 	void *value;
41 	void *libaa_handle = dlopen("libaa.so", RTLD_LAZY);
42 	void *libc_handle = dlopen("libc.so", RTLD_LAZY);
43 	void *libaa_sigprocmask = dlsym(libaa_handle, "sigprocmask");
44 	void *libc_sigprocmask = dlsym(libc_handle, "sigprocmask");
45 
46 	dlclose(libaa_handle);
47 	dlclose(libc_handle);
48 
49 	/* basic sanity check */
50 	if (libaa_sigprocmask == &sigprocmask || libc_sigprocmask == &sigprocmask ||
51 	    libc_sigprocmask == libaa_sigprocmask || libaa_sigprocmask == NULL ||
52 	    libc_sigprocmask == NULL) {
53 		printf("dlsym(handle, ...)\n FAILED\n");
54 		printf("sigprocmask       == %p\n", &sigprocmask);
55 		printf("libaa_sigprocmask == %p\n", libaa_sigprocmask);
56 		printf("libc_sigprocmask  == %p\n", libc_sigprocmask);
57 		return (1);
58 	}
59 
60 	value = dlsym(RTLD_DEFAULT, "sigprocmask");
61 	if (value != &sigprocmask) {
62 		printf("dlsym(RTLD_DEFAULT, \"sigprocmask\") == %p FAILED\n", value);
63 		printf("\twas expecting == %p (&sigprocmask)\n", &sigprocmask);
64 		ret = 1;
65 	}
66 
67 	value = dlsym(RTLD_SELF, "sigprocmask");
68 	if (value != libaa_sigprocmask) {
69 		printf("dlsym(RTLD_SELF, \"sigprocmask\") == %p FAILED\n", value);
70 		printf("\twas expecting == %p (libaa_sigprocmask)\n", libaa_sigprocmask);
71 		printf("FAILED\n");
72 		ret = 1;
73 	}
74 
75 	value = dlsym(RTLD_NEXT, "sigprocmask");
76 	if (value != libc_sigprocmask) {
77 		printf("dlsym(RTLD_NEXT, \"sigprocmask\") == %p FAILED\n", value);
78 		printf("\twas expecting == %p (libc_sigprocmask)\n", libc_sigprocmask);
79 		ret = 1;
80 	}
81 
82 	value = dlsym(NULL, "sigprocmask");
83 	if (value != libaa_sigprocmask) {
84 		printf("dlsym(NULL, \"sigprocmask\") == %p FAILED\n", value);
85 		printf("\twas expecting == %p (libaa_sigprocmask)\n", libaa_sigprocmask);
86 		ret = 1;
87 	}
88 
89 	return (ret);
90 }
91