1/* 2 * Copyright (c) 2006-2010 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#ifndef _DYLD_IMAGES_ 24#define _DYLD_IMAGES_ 25 26#include <stdbool.h> 27#include <unistd.h> 28#include <mach/mach.h> 29 30#ifdef __cplusplus 31extern "C" { 32#endif 33 34 35/* 36 * Beginning in Mac OS X 10.4, this is how gdb discovers which mach-o images are loaded in a process. 37 * 38 * gdb looks for the symbol "_dyld_all_image_infos" in dyld. It contains the fields below. 39 * 40 * For a snashot of what images are currently loaded, the infoArray fields contain a pointer 41 * to an array of all images. If infoArray is NULL, it means it is being modified, come back later. 42 * 43 * To be notified of changes, gdb sets a break point on the address pointed to by the notificationn 44 * field. The function it points to is called by dyld with an array of information about what images 45 * have been added (dyld_image_adding) or are about to be removed (dyld_image_removing). 46 * 47 * The notification is called after infoArray is updated. This means that if gdb attaches to a process 48 * and infoArray is NULL, gdb can set a break point on notification and let the proccess continue to 49 * run until the break point. Then gdb can inspect the full infoArray. 50 * 51 * The dyldVersion field always points to a C string that contains the dyld version. For instance, 52 * in dyld-127.3, dyldVersion would contain a pointer to "127.3". 53 * 54 * The errorMessage and terminationFlags fields are normally zero. If dyld terminates a process 55 * (for instance because a required dylib or symbol is missing), then the errorMessage field will 56 * be set to point to a C string message buffer containing the reason dyld terminate the process. 57 * The low bit of the terminationFlags will be set if dyld terminated the process before any user 58 * code ran, in which case there is no need for the crash log to contain the backtrace. 59 * 60 * When dyld terminates a process because some required dylib or symbol cannot be bound, in 61 * addition to the errorMessage field, it now sets the errorKind field and the corresponding 62 * fields: errorClientOfDylibPath, errorTargetDylibPath, errorSymbol. 63 * 64 */ 65 66enum dyld_image_mode { dyld_image_adding=0, dyld_image_removing=1, dyld_image_info_change=2 }; 67 68struct dyld_image_info { 69 const struct mach_header* imageLoadAddress; /* base address image is mapped into */ 70 const char* imageFilePath; /* path dyld used to load the image */ 71 uintptr_t imageFileModDate; /* time_t of image file */ 72 /* if stat().st_mtime of imageFilePath does not match imageFileModDate, */ 73 /* then file has been modified since dyld loaded it */ 74}; 75 76struct dyld_uuid_info { 77 const struct mach_header* imageLoadAddress; /* base address image is mapped into */ 78 uuid_t imageUUID; /* UUID of image */ 79}; 80 81typedef void (*dyld_image_notifier)(enum dyld_image_mode mode, uint32_t infoCount, const struct dyld_image_info info[]); 82 83/* for use in dyld_all_image_infos.errorKind field */ 84enum { dyld_error_kind_none=0, 85 dyld_error_kind_dylib_missing=1, 86 dyld_error_kind_dylib_wrong_arch=2, 87 dyld_error_kind_dylib_version=3, 88 dyld_error_kind_symbol_missing=4 89 }; 90 91 92struct dyld_all_image_infos { 93 uint32_t version; /* 1 in Mac OS X 10.4 and 10.5 */ 94 uint32_t infoArrayCount; 95 const struct dyld_image_info* infoArray; 96 dyld_image_notifier notification; 97 bool processDetachedFromSharedRegion; 98 /* the following fields are only in version 2 (Mac OS X 10.6, iPhoneOS 2.0) and later */ 99 bool libSystemInitialized; 100 const struct mach_header* dyldImageLoadAddress; 101 /* the following field is only in version 3 (Mac OS X 10.6, iPhoneOS 3.0) and later */ 102 void* jitInfo; 103 /* the following fields are only in version 5 (Mac OS X 10.6, iPhoneOS 3.0) and later */ 104 const char* dyldVersion; 105 const char* errorMessage; 106 uintptr_t terminationFlags; 107 /* the following field is only in version 6 (Mac OS X 10.6, iPhoneOS 3.1) and later */ 108 void* coreSymbolicationShmPage; 109 /* the following field is only in version 7 (Mac OS X 10.6, iPhoneOS 3.1) and later */ 110 uintptr_t systemOrderFlag; 111 /* the following field is only in version 8 (Mac OS X 10.7, iPhoneOS 3.1) and later */ 112 uintptr_t uuidArrayCount; 113 const struct dyld_uuid_info* uuidArray; /* only images not in dyld shared cache */ 114 /* the following field is only in version 9 (Mac OS X 10.7, iOS 4.0) and later */ 115 struct dyld_all_image_infos* dyldAllImageInfosAddress; 116 /* the following field is only in version 10 (Mac OS X 10.7, iOS 4.2) and later */ 117 uintptr_t initialImageCount; 118 /* the following field is only in version 11 (Mac OS X 10.7, iOS 4.2) and later */ 119 uintptr_t errorKind; 120 const char* errorClientOfDylibPath; 121 const char* errorTargetDylibPath; 122 const char* errorSymbol; 123 /* the following field is only in version 12 (Mac OS X 10.7, iOS 4.3) and later */ 124 uintptr_t sharedCacheSlide; 125 /* the following field is only in version 13 (Mac OS X 10.9, iOS 7.0) and later */ 126 uint8_t sharedCacheUUID[16]; 127 /* the following field is only in version 14 (Mac OS X 10.9, iOS 7.0) and later */ 128 uintptr_t reserved[16]; 129}; 130 131 132/* 133 * Beginning in Mac OS X 10.5, this is how gdb discovers where the shared cache is in a process. 134 * Images that are in the shared cache have their segments rearranged, so when using imageFilePath 135 * to load the file from disk, you have to know to adjust addresses based on how their segment 136 * was rearranged. 137 * 138 * gdb looks for the symbol "_dyld_shared_region_ranges" in dyld. 139 * 140 * It contains information the count of shared regions used by the process. The count is 141 * the number of start/length pairs. 142 */ 143struct dyld_shared_cache_ranges { 144 uintptr_t sharedRegionsCount; /* how many ranges follow */ 145 struct { 146 uintptr_t start; 147 uintptr_t length; 148 } ranges[4]; /* max regions */ 149}; 150extern struct dyld_shared_cache_ranges dyld_shared_cache_ranges; 151 152 153 154#ifdef __cplusplus 155} 156#endif 157 158#endif /* _DYLD_IMAGES_ */ 159