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