dyld-732.8.tar.gz
[apple/dyld.git] / src / dyld_process_info_internal.h
1 /* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*-
2 *
3 * Copyright (c) 2016 Apple Inc. All rights reserved.
4 *
5 * @APPLE_LICENSE_HEADER_START@
6 *
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
12 * file.
13 *
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.
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24
25 #ifndef _DYLD_PROCESS_INFO_INTERNAL_H_
26 #define _DYLD_PROCESS_INFO_INTERNAL_H_
27
28 #define VIS_HIDDEN __attribute__((visibility("hidden")))
29
30 #include <stdlib.h>
31 #include <string.h>
32 #include <limits.h>
33 #include <stdio.h>
34 #include <uuid/uuid.h>
35
36 #include <array>
37
38 struct dyld_all_image_infos_32 {
39 uint32_t version;
40 uint32_t infoArrayCount;
41 std::atomic<uint32_t> infoArray;
42 uint32_t notification;
43 bool processDetachedFromSharedRegion;
44 bool libSystemInitialized;
45 uint32_t dyldImageLoadAddress;
46 uint32_t jitInfo;
47 uint32_t dyldVersion;
48 uint32_t errorMessage;
49 uint32_t terminationFlags;
50 uint32_t coreSymbolicationShmPage;
51 uint32_t systemOrderFlag;
52 uint32_t uuidArrayCount;
53 uint32_t uuidArray;
54 uint32_t dyldAllImageInfosAddress;
55 uint32_t initialImageCount;
56 uint32_t errorKind;
57 uint32_t errorClientOfDylibPath;
58 uint32_t errorTargetDylibPath;
59 uint32_t errorSymbol;
60 uint32_t sharedCacheSlide;
61 std::array<uint8_t, 16> sharedCacheUUID;
62 uint32_t sharedCacheBaseAddress;
63 std::atomic<uint64_t> infoArrayChangeTimestamp;
64 uint32_t dyldPath;
65 uint32_t notifyMachPorts[8];
66 uint32_t reserved[5];
67 uint32_t compact_dyld_image_info_addr;
68 uint32_t compact_dyld_image_info_size;
69 uint32_t platform;
70 };
71
72 struct dyld_all_image_infos_64 {
73 uint32_t version;
74 uint32_t infoArrayCount;
75 std::atomic<uint64_t> infoArray;
76 uint64_t notification;
77 bool processDetachedFromSharedRegion;
78 bool libSystemInitialized;
79 uint32_t paddingToMakeTheSizeCorrectOn32bitAndDoesntAffect64b; // NOT PART OF DYLD_ALL_IMAGE_INFOS!
80 uint64_t dyldImageLoadAddress;
81 uint64_t jitInfo;
82 uint64_t dyldVersion;
83 uint64_t errorMessage;
84 uint64_t terminationFlags;
85 uint64_t coreSymbolicationShmPage;
86 uint64_t systemOrderFlag;
87 uint64_t uuidArrayCount;
88 uint64_t uuidArray;
89 uint64_t dyldAllImageInfosAddress;
90 uint64_t initialImageCount;
91 uint64_t errorKind;
92 uint64_t errorClientOfDylibPath;
93 uint64_t errorTargetDylibPath;
94 uint64_t errorSymbol;
95 uint64_t sharedCacheSlide;
96 std::array<uint8_t, 16> sharedCacheUUID;
97 uint64_t sharedCacheBaseAddress;
98 std::atomic<uint64_t> infoArrayChangeTimestamp;
99 uint64_t dyldPath;
100 uint32_t notifyMachPorts[8];
101 uint64_t reserved[9];
102 uint64_t compact_dyld_image_info_addr;
103 uint64_t compact_dyld_image_info_size;
104 uint32_t platform;
105 };
106
107 struct dyld_image_info_32 {
108 uint32_t imageLoadAddress;
109 uint32_t imageFilePath;
110 uint32_t imageFileModDate;
111 };
112 struct dyld_image_info_64 {
113 uint64_t imageLoadAddress;
114 uint64_t imageFilePath;
115 uint64_t imageFileModDate;
116 };
117
118 #define DYLD_PROCESS_INFO_NOTIFY_MAX_BUFFER_SIZE (32*1024)
119 #define DYLD_PROCESS_INFO_NOTIFY_LOAD_ID 0x1000
120 #define DYLD_PROCESS_INFO_NOTIFY_UNLOAD_ID 0x2000
121 #define DYLD_PROCESS_INFO_NOTIFY_MAIN_ID 0x3000
122
123
124 struct dyld_process_info_image_entry {
125 uuid_t uuid;
126 uint64_t loadAddress;
127 uint32_t pathStringOffset;
128 uint32_t pathLength;
129 };
130
131 struct dyld_process_info_notify_header {
132 mach_msg_header_t header;
133 uint32_t version;
134 uint32_t imageCount;
135 uint32_t imagesOffset;
136 uint32_t stringsOffset;
137 uint64_t timestamp;
138 };
139
140 //FIXME: Refactor this out into a seperate file
141 struct VIS_HIDDEN RemoteBuffer {
142 RemoteBuffer();
143 RemoteBuffer(task_t task, mach_vm_address_t remote_address, size_t remote_size, bool shared, bool allow_truncation);
144 RemoteBuffer& operator=(RemoteBuffer&& other);
145 ~RemoteBuffer();
146 void *getLocalAddress() const;
147 kern_return_t getKernelReturn() const;
148 size_t getSize() const;
149 private:
150 static std::pair<mach_vm_address_t, kern_return_t> map( task_t task, mach_vm_address_t remote_address,
151 vm_size_t _size, bool shared);
152 static std::tuple<mach_vm_address_t,vm_size_t,kern_return_t,bool>create( task_t task,
153 mach_vm_address_t remote_address,
154 size_t remote_size,
155 bool shared,
156 bool allow_truncation);
157 RemoteBuffer(std::tuple<mach_vm_address_t,vm_size_t,kern_return_t,bool> T);
158
159 mach_vm_address_t _localAddress;
160 vm_size_t _size;
161 kern_return_t _kr;
162 bool _shared;
163 };
164
165 // only called during libdyld set up
166 void setNotifyMonitoringDyldMain(void (*func)()) VIS_HIDDEN;
167 void setNotifyMonitoringDyld(void (*func)(bool unloading, unsigned imageCount,
168 const struct mach_header* loadAddresses[],
169 const char* imagePaths[])) VIS_HIDDEN;
170
171 void withRemoteBuffer(task_t task, mach_vm_address_t remote_address, size_t remote_size, bool shared, bool allow_truncation, kern_return_t *kr, void (^block)(void *buffer, size_t size)) __attribute__((visibility("hidden")));
172
173 template<typename T>
174 VIS_HIDDEN void withRemoteObject(task_t task, mach_vm_address_t remote_address, bool shared, kern_return_t *kr, void (^block)(T t))
175 {
176 withRemoteBuffer(task, remote_address, sizeof(T), shared, false, kr, ^(void *buffer, size_t size) {
177 block(*reinterpret_cast<T *>(buffer));
178 });
179 }
180
181
182 #endif // _DYLD_PROCESS_INFO_INTERNAL_H_
183
184