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