1/* 2 * Copyright (c) 2005-2009 Apple 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 <malloc/malloc.h> 32#include <stdlib.h> 33#include <Availability.h> 34 35 36#include "test.h" // PASS(), FAIL() 37 38typedef bool (*CheckFunc)(); 39 40int main() 41{ 42// NSCreateObjectFileImageFromMemory is only available on Mac OS X - not iPhone OS 43#if __MAC_OS_X_VERSION_MIN_REQUIRED 44 int fd = open("test.bundle", O_RDONLY, 0); 45 if ( fd == -1 ) { 46 FAIL("open() failed"); 47 return 1; 48 } 49 50 struct stat stat_buf; 51 if ( fstat(fd, &stat_buf) == -1) { 52 FAIL("fstat() failed"); 53 return 1; 54 } 55 56 void* loadAddress = malloc((stat_buf.st_size+4095) & (-4096)); 57 if ( loadAddress == NULL ) { 58 FAIL("malloc failed"); 59 return 1; 60 } 61 62 if ( pread(fd, loadAddress, stat_buf.st_size, 0) != stat_buf.st_size ) { 63 FAIL("pread() failed"); 64 return 1; 65 } 66 67 //void* loadAddress2 = mmap(NULL, stat_buf.st_size, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0); 68 close(fd); 69 70 NSObjectFileImage ofi; 71 if ( NSCreateObjectFileImageFromMemory(loadAddress, stat_buf.st_size, &ofi) != NSObjectFileImageSuccess ) { 72 FAIL("NSCreateObjectFileImageFromMemory failed"); 73 return 1; 74 } 75 76 NSModule mod = NSLinkModule(ofi, "he_he", NSLINKMODULE_OPTION_NONE); 77 if ( mod == NULL ) { 78 FAIL("NSLinkModule failed"); 79 return 1; 80 } 81 82 NSSymbol sym = NSLookupSymbolInModule(mod, "_checkdata"); 83 if ( sym == NULL ) { 84 FAIL("NSLookupSymbolInModule failed"); 85 return 1; 86 } 87 88 CheckFunc func = NSAddressOfSymbol(sym); 89 if ( !func() ) { 90 FAIL("NSAddressOfSymbol failed"); 91 return 1; 92 } 93 94 if ( !NSUnLinkModule(mod, NSUNLINKMODULE_OPTION_NONE) ) { 95 FAIL("NSUnLinkModule failed"); 96 return 1; 97 } 98 99 if ( !NSDestroyObjectFileImage(ofi) ) { 100 FAIL("NSDestroyObjectFileImage failed"); 101 return 1; 102 } 103 //fprintf(stderr, "loadAddress=%p\n", loadAddress); 104 //fprintf(stderr, "malloc_size(loadAddress) => 0x%08X\n", malloc_size(loadAddress)); 105 //fprintf(stderr, "loadAddress2=%p\n", loadAddress2); 106 //fprintf(stderr, "malloc_size(loadAddress2) => 0x%08X\n", malloc_size(loadAddress2)); 107 108 109 //free(loadAddress); 110 //fprintf(stderr, "malloc_size(loadAddress) => 0x%08X\n", malloc_size(loadAddress)); 111 if ( malloc_size(loadAddress) != 0 ) { 112 FAIL("malloc_size(loadAddress) => 0x%08X", malloc_size(loadAddress)); 113 FAIL("malloc still thinks it owns this block"); 114 return 1; 115 } 116 117 // Should check that loadAddress is unmmaped now (by call to NSDestroyObjectFileImage) 118#endif 119 120 PASS("bundle-memory-load-malloc"); 121 return 0; 122}