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
sigprocmask()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
aaTest()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