1/* 2 * Copyright (c) 2005-2008 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23#include <stdio.h> // fprintf(), NULL 24#include <stdlib.h> // exit(), EXIT_SUCCESS 25#include <string.h> 26#include <dlfcn.h> 27#include <mach-o/dyld.h> 28#include <Availability.h> 29 30#include "test.h" // PASS(), FAIL(), XPASS(), XFAIL() 31 32 33 34int bar() 35{ 36 return 2; 37} 38 39static int foo() 40{ 41 return 3; 42} 43 44__attribute__((visibility("hidden"))) int hide() 45{ 46 return 4; 47} 48 49// checks global symbol 50static void verifybar() 51{ 52 Dl_info info; 53 if ( dladdr(&bar, &info) == 0 ) { 54 FAIL("dladdr(&bar, xx) failed"); 55 exit(0); 56 } 57 if ( strcmp(info.dli_sname, "bar") != 0 ) { 58 if ( strcmp(info.dli_sname, "_bar") == 0 ) { 59 XFAIL("dladdr()->dli_sname is \"%s\" instead of \"bar\"", info.dli_sname); 60 } 61 else { 62 FAIL("dladdr()->dli_sname is \"%s\" instead of \"bar\"", info.dli_sname); 63 exit(0); 64 } 65 } 66 if ( info.dli_saddr != &bar) { 67 FAIL("dladdr()->dli_saddr is not &bar"); 68 exit(0); 69 } 70#if __MAC_OS_X_VERSION_MIN_REQUIRED 71 if ( info.dli_fbase != _dyld_get_image_header_containing_address(&bar) ) { 72 FAIL("dladdr()->dli_fbase is not image that contains &bar"); 73 exit(0); 74 } 75#endif 76} 77 78// checks local symbol 79static void verifyfoo() 80{ 81 Dl_info info; 82 if ( dladdr(&foo, &info) == 0 ) { 83 FAIL("dladdr(&foo, xx) failed"); 84 exit(0); 85 } 86 if ( strcmp(info.dli_sname, "foo") != 0 ) { 87 FAIL("dladdr()->dli_sname is \"%s\" instead of \"foo\"", info.dli_sname); 88 exit(0); 89 } 90 if ( info.dli_saddr != &foo) { 91 FAIL("dladdr()->dli_saddr is not &foo"); 92 exit(0); 93 } 94#if __MAC_OS_X_VERSION_MIN_REQUIRED 95 if ( info.dli_fbase != _dyld_get_image_header_containing_address(&foo) ) { 96 FAIL("dladdr()->dli_fbase is not image that contains &foo"); 97 exit(0); 98 } 99#endif 100} 101 102// checks hidden symbol 103static void verifyhide() 104{ 105 Dl_info info; 106 if ( dladdr(&hide, &info) == 0 ) { 107 FAIL("dladdr(&hide, xx) failed"); 108 exit(0); 109 } 110 if ( strcmp(info.dli_sname, "hide") != 0 ) { 111 FAIL("dladdr()->dli_sname is \"%s\" instead of \"hide\"", info.dli_sname); 112 exit(0); 113 } 114 if ( info.dli_saddr != &hide) { 115 FAIL("dladdr()->dli_saddr is not &hide"); 116 exit(0); 117 } 118#if __MAC_OS_X_VERSION_MIN_REQUIRED 119 if ( info.dli_fbase != _dyld_get_image_header_containing_address(&hide) ) { 120 FAIL("dladdr()->dli_fbase is not image that contains &hide"); 121 exit(0); 122 } 123#endif 124} 125 126 127int main() 128{ 129 verifybar(); 130 verifyhide(); 131 verifyfoo(); 132 133 134 PASS("dladdr"); 135 return EXIT_SUCCESS; 136} 137