1 /* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*-
3 * Copyright (c) 2016 Apple Inc. All rights reserved.
5 * @APPLE_LICENSE_HEADER_START@
7 * This file contains Original Code and/or Modifications of Original Code
8 * as defined in and that are subject to the Apple Public Source License
9 * Version 2.0 (the 'License'). You may not use this file except in
10 * compliance with the License. Please obtain a copy of the License at
11 * http://www.opensource.apple.com/apsl/ and read it before using this
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
19 * Please see the License for the specific language governing rights and
20 * limitations under the License.
22 * @APPLE_LICENSE_HEADER_END@
25 #ifndef _DYLD_PROCESS_INFO_INTERNAL_H_
26 #define _DYLD_PROCESS_INFO_INTERNAL_H_
28 #define VIS_HIDDEN __attribute__((visibility("hidden")))
34 #include <uuid/uuid.h>
38 struct dyld_all_image_infos_32
{
40 uint32_t infoArrayCount
;
41 std::atomic
<uint32_t> infoArray
;
42 uint32_t notification
;
43 bool processDetachedFromSharedRegion
;
44 bool libSystemInitialized
;
45 uint32_t dyldImageLoadAddress
;
48 uint32_t errorMessage
;
49 uint32_t terminationFlags
;
50 uint32_t coreSymbolicationShmPage
;
51 uint32_t systemOrderFlag
;
52 uint32_t uuidArrayCount
;
54 uint32_t dyldAllImageInfosAddress
;
55 uint32_t initialImageCount
;
57 uint32_t errorClientOfDylibPath
;
58 uint32_t errorTargetDylibPath
;
60 uint32_t sharedCacheSlide
;
61 std::array
<uint8_t, 16> sharedCacheUUID
;
62 uint32_t sharedCacheBaseAddress
;
63 std::atomic
<uint64_t> infoArrayChangeTimestamp
;
65 uint32_t notifyMachPorts
[8];
67 uint32_t compact_dyld_image_info_addr
;
68 uint32_t compact_dyld_image_info_size
;
70 // the aot fields below will not be set in the 32 bit case
71 uint32_t aotInfoCount
;
72 std::atomic
<uint64_t> aotInfoArray
;
73 uint64_t aotInfoArrayChangeTimestamp
;
74 uint64_t aotSharedCacheBaseAddress
;
75 std::array
<uint8_t, 16> aotSharedCacheUUID
[16];
78 struct dyld_all_image_infos_64
{
80 uint32_t infoArrayCount
;
81 std::atomic
<uint64_t> infoArray
;
82 uint64_t notification
;
83 bool processDetachedFromSharedRegion
;
84 bool libSystemInitialized
;
85 uint32_t paddingToMakeTheSizeCorrectOn32bitAndDoesntAffect64b
; // NOT PART OF DYLD_ALL_IMAGE_INFOS!
86 uint64_t dyldImageLoadAddress
;
89 uint64_t errorMessage
;
90 uint64_t terminationFlags
;
91 uint64_t coreSymbolicationShmPage
;
92 uint64_t systemOrderFlag
;
93 uint64_t uuidArrayCount
;
95 uint64_t dyldAllImageInfosAddress
;
96 uint64_t initialImageCount
;
98 uint64_t errorClientOfDylibPath
;
99 uint64_t errorTargetDylibPath
;
100 uint64_t errorSymbol
;
101 uint64_t sharedCacheSlide
;
102 std::array
<uint8_t, 16> sharedCacheUUID
;
103 uint64_t sharedCacheBaseAddress
;
104 std::atomic
<uint64_t> infoArrayChangeTimestamp
;
106 uint32_t notifyMachPorts
[8];
107 uint64_t reserved
[9];
108 uint64_t compact_dyld_image_info_addr
;
109 uint64_t compact_dyld_image_info_size
;
111 uint32_t aotInfoCount
;
112 std::atomic
<uint64_t> aotInfoArray
;
113 uint64_t aotInfoArrayChangeTimestamp
;
114 uint64_t aotSharedCacheBaseAddress
;
115 std::array
<uint8_t, 16> aotSharedCacheUUID
[16];
118 struct dyld_image_info_32
{
119 uint32_t imageLoadAddress
;
120 uint32_t imageFilePath
;
121 uint32_t imageFileModDate
;
123 struct dyld_image_info_64
{
124 uint64_t imageLoadAddress
;
125 uint64_t imageFilePath
;
126 uint64_t imageFileModDate
;
129 #define DYLD_AOT_IMAGE_KEY_SIZE 32
130 struct dyld_aot_image_info_64
{
131 uint64_t x86LoadAddress
;
132 uint64_t aotLoadAddress
;
133 uint64_t aotImageSize
;
134 uint8_t aotImageKey
[DYLD_AOT_IMAGE_KEY_SIZE
];
137 #define DYLD_PROCESS_INFO_NOTIFY_MAX_BUFFER_SIZE (32*1024)
138 #define DYLD_PROCESS_INFO_NOTIFY_LOAD_ID 0x1000
139 #define DYLD_PROCESS_INFO_NOTIFY_UNLOAD_ID 0x2000
140 #define DYLD_PROCESS_INFO_NOTIFY_MAIN_ID 0x3000
143 struct dyld_process_info_image_entry
{
145 uint64_t loadAddress
;
146 uint32_t pathStringOffset
;
150 struct dyld_process_info_notify_header
{
151 mach_msg_header_t header
;
154 uint32_t imagesOffset
;
155 uint32_t stringsOffset
;
159 //FIXME: Refactor this out into a seperate file
160 struct VIS_HIDDEN RemoteBuffer
{
162 RemoteBuffer(task_t task
, mach_vm_address_t remote_address
, size_t remote_size
, bool allow_truncation
);
163 RemoteBuffer
& operator=(RemoteBuffer
&& other
);
165 void *getLocalAddress() const;
166 kern_return_t
getKernelReturn() const;
167 size_t getSize() const;
169 static std::pair
<mach_vm_address_t
, kern_return_t
> map( task_t task
, mach_vm_address_t remote_address
, vm_size_t _size
);
170 static std::tuple
<mach_vm_address_t
,vm_size_t
,kern_return_t
>create( task_t task
,
171 mach_vm_address_t remote_address
,
173 bool allow_truncation
);
174 RemoteBuffer(std::tuple
<mach_vm_address_t
,vm_size_t
,kern_return_t
> T
);
176 mach_vm_address_t _localAddress
;
181 // only called during libdyld set up
182 void setNotifyMonitoringDyldMain(void (*func
)()) VIS_HIDDEN
;
183 void setNotifyMonitoringDyld(void (*func
)(bool unloading
, unsigned imageCount
,
184 const struct mach_header
* loadAddresses
[],
185 const char* imagePaths
[])) VIS_HIDDEN
;
187 void withRemoteBuffer(task_t task
, mach_vm_address_t remote_address
, size_t remote_size
, bool allow_truncation
, kern_return_t
*kr
, void (^block
)(void *buffer
, size_t size
)) __attribute__((visibility("hidden")));
190 VIS_HIDDEN
void withRemoteObject(task_t task
, mach_vm_address_t remote_address
, kern_return_t
*kr
, void (^block
)(T t
))
192 withRemoteBuffer(task
, remote_address
, sizeof(T
), false, kr
, ^(void *buffer
, size_t size
) {
193 block(*reinterpret_cast<T
*>(buffer
));
198 #endif // _DYLD_PROCESS_INFO_INTERNAL_H_