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