1/* 2 * Copyright (c) 2005 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> 24#include <stdbool.h> 25#include <mach-o/dyld.h> 26#include <sys/types.h> 27#include <sys/stat.h> 28#include <sys/mman.h> 29#include <unistd.h> 30#include <fcntl.h> 31#include <Availability.h> 32 33#include "test.h" // PASS(), FAIL() 34 35typedef bool (*CheckFunc)(); 36 37int main() 38{ 39// NSObjectFileImage APIs are only available on Mac OS X - not iPhone OS 40#if __MAC_OS_X_VERSION_MIN_REQUIRED 41 int fd = open("test.bundle", O_RDONLY, 0); 42 if ( fd == -1 ) { 43 FAIL("open() failed"); 44 return 1; 45 } 46 47 struct stat stat_buf; 48 if ( fstat(fd, &stat_buf) == -1) { 49 FAIL("fstat() failed"); 50 return 1; 51 } 52 53 void* loadAddress = mmap(NULL, stat_buf.st_size, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0); 54 if ( loadAddress == ((void*)(-1)) ) { 55 FAIL("mmap() failed"); 56 return 1; 57 } 58 59 close(fd); 60 61 NSObjectFileImage ofi; 62 if ( NSCreateObjectFileImageFromMemory(loadAddress, stat_buf.st_size, &ofi) != NSObjectFileImageSuccess ) { 63 FAIL("NSCreateObjectFileImageFromMemory failed"); 64 return 1; 65 } 66 67 NSModule mod = NSLinkModule(ofi, "he_he", NSLINKMODULE_OPTION_NONE); 68 if ( mod == NULL ) { 69 FAIL("NSLinkModule failed"); 70 return 1; 71 } 72 73 NSSymbol sym = NSLookupSymbolInModule(mod, "_checkdata"); 74 if ( sym == NULL ) { 75 FAIL("NSLookupSymbolInModule failed"); 76 return 1; 77 } 78 79 CheckFunc func = NSAddressOfSymbol(sym); 80 if ( !func() ) { 81 FAIL("NSAddressOfSymbol failed"); 82 return 1; 83 } 84 85 if ( !NSUnLinkModule(mod, NSUNLINKMODULE_OPTION_NONE) ) { 86 FAIL("NSUnLinkModule failed"); 87 return 1; 88 } 89 90 if ( !NSDestroyObjectFileImage(ofi) ) { 91 FAIL("NSDestroyObjectFileImage failed"); 92 return 1; 93 } 94 95 // Should check that loadAddress is unmmaped now (by call to NSDestroyObjectFileImage) 96#endif 97 98 PASS("bundle-memory-load"); 99 return 0; 100}