1 /* $OpenBSD: main.c,v 1.1 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 mainSymbol; 23 24 int 25 main() 26 { 27 int ret = 1; 28 void *prog; 29 void *libbb; 30 void *libcc; 31 void *p_sym; 32 void *bbsym; 33 void *ccsym; 34 void *a_sym; 35 36 37 prog = dlopen(NULL, RTLD_LAZY); 38 if (prog == NULL) { 39 printf("dlopen(NULL, RTLD_LAZY) FAILED\n"); 40 return (1); 41 } 42 43 libbb = dlopen("libbb.so", RTLD_LAZY|RTLD_GLOBAL); 44 if (libbb == NULL) { 45 printf("dlopen(\"libbb.so\", RTLD_LAZY) FAILED\n"); 46 return (1); 47 } 48 49 libcc = dlopen("libcc.so", RTLD_LAZY|RTLD_GLOBAL); 50 if (libcc == NULL) { 51 printf("dlopen(\"libcc.so\", RTLD_LAZY) FAILED\n"); 52 return (1); 53 } 54 55 p_sym = dlsym(prog, "commonSymbol"); 56 bbsym = dlsym(libbb, "commonSymbol"); 57 ccsym = dlsym(libcc, "commonSymbol"); 58 a_sym = dlsym(RTLD_DEFAULT, "commonSymbol"); 59 60 if(a_sym == p_sym) { 61 ret = 0; 62 } 63 if(a_sym == bbsym) { 64 printf("found common symbol in libbb incorrect location\n"); 65 ret = 1; 66 } 67 if(a_sym == ccsym) { 68 printf("found common symbol in libcc incorrect location\n"); 69 ret = 1; 70 } 71 72 dlclose(libbb); 73 dlclose(libcc); 74 75 return (ret); 76 } 77