23
23
#include " ImageInspection.h"
24
24
#include < mach-o/dyld.h>
25
25
#include < mach-o/getsect.h>
26
+ #include < objc/runtime.h>
26
27
#include < assert.h>
27
28
#include < dlfcn.h>
28
29
@@ -55,7 +56,7 @@ extern "C" void *_NSGetMachExecuteHeader();
55
56
56
57
template <const char *SEGMENT_NAME, const char *SECTION_NAME,
57
58
void CONSUME_BLOCK (const void *start, uintptr_t size)>
58
- void addImageCallback(const mach_header *mh, intptr_t vmaddr_slide ) {
59
+ void addImageCallback(const mach_header *mh) {
59
60
#if __POINTER_WIDTH__ == 64
60
61
assert (mh->magic == MH_MAGIC_64 && " loaded non-64-bit image?!" );
61
62
#endif
@@ -72,12 +73,17 @@ void addImageCallback(const mach_header *mh, intptr_t vmaddr_slide) {
72
73
73
74
CONSUME_BLOCK (section, size);
74
75
}
76
+ template <const char *SEGMENT_NAME, const char *SECTION_NAME,
77
+ void CONSUME_BLOCK (const void *start, uintptr_t size)>
78
+ void addImageCallback(const mach_header *mh, intptr_t vmaddr_slide) {
79
+ addImageCallback<SEGMENT_NAME, SECTION_NAME, CONSUME_BLOCK>(mh);
80
+ }
75
81
76
82
template <const char *SEGMENT_NAME, const char *SECTION_NAME,
77
83
const char *SEGMENT_NAME2, const char *SECTION_NAME2,
78
84
void CONSUME_BLOCK (const void *start, uintptr_t size,
79
85
const void *start2, uintptr_t size2)>
80
- void addImageCallback2Sections(const mach_header *mh, intptr_t vmaddr_slide ) {
86
+ void addImageCallback2Sections(const mach_header *mh) {
81
87
#if __POINTER_WIDTH__ == 64
82
88
assert (mh->magic == MH_MAGIC_64 && " loaded non-64-bit image?!" );
83
89
#endif
@@ -103,27 +109,48 @@ void addImageCallback2Sections(const mach_header *mh, intptr_t vmaddr_slide) {
103
109
104
110
CONSUME_BLOCK (section, size, section2, size2);
105
111
}
112
+ template <const char *SEGMENT_NAME, const char *SECTION_NAME,
113
+ const char *SEGMENT_NAME2, const char *SECTION_NAME2,
114
+ void CONSUME_BLOCK (const void *start, uintptr_t size,
115
+ const void *start2, uintptr_t size2)>
116
+ void addImageCallback2Sections(const mach_header *mh, intptr_t vmaddr_slide) {
117
+ addImageCallback2Sections<SEGMENT_NAME, SECTION_NAME,
118
+ SEGMENT_NAME2, SECTION_NAME2,
119
+ CONSUME_BLOCK>(mh);
120
+ }
121
+
106
122
} // end anonymous namespace
107
123
124
+ #if OBJC_ADDLOADIMAGEFUNC_DEFINED
125
+ #define REGISTER_FUNC (...) \
126
+ if (__builtin_available(macOS 10.15 , iOS 13 , tvOS 13 , watchOS 6 , *)) { \
127
+ objc_addLoadImageFunc (__VA_ARGS__); \
128
+ } else { \
129
+ _dyld_register_func_for_add_image (__VA_ARGS__); \
130
+ }
131
+ #else
132
+ #define REGISTER_FUNC (...) _dyld_register_func_for_add_image(__VA_ARGS__)
133
+ #endif
134
+
108
135
void swift::initializeProtocolLookup () {
109
- _dyld_register_func_for_add_image (
136
+ REGISTER_FUNC (
110
137
addImageCallback<TextSegment, ProtocolsSection,
111
138
addImageProtocolsBlockCallback>);
112
139
}
113
140
114
141
void swift::initializeProtocolConformanceLookup () {
115
- _dyld_register_func_for_add_image (
142
+ REGISTER_FUNC (
116
143
addImageCallback<TextSegment, ProtocolConformancesSection,
117
144
addImageProtocolConformanceBlockCallback>);
118
145
}
119
146
void swift::initializeTypeMetadataRecordLookup () {
120
- _dyld_register_func_for_add_image (
147
+ REGISTER_FUNC (
121
148
addImageCallback<TextSegment, TypeMetadataRecordSection,
122
149
addImageTypeMetadataRecordBlockCallback>);
123
150
}
124
151
125
152
void swift::initializeDynamicReplacementLookup () {
126
- _dyld_register_func_for_add_image (
153
+ REGISTER_FUNC (
127
154
addImageCallback2Sections<TextSegment, DynamicReplacementSection,
128
155
TextSegment, DynamicReplacementSomeSection,
129
156
addImageDynamicReplacementBlockCallback>);
0 commit comments