dyld-732.8.tar.gz
[apple/dyld.git] / include / mach-o / dyld.h
1 /*
2 * Copyright (c) 1999-2008 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 _MACH_O_DYLD_H_
24 #define _MACH_O_DYLD_H_
25
26
27 #include <stddef.h>
28 #include <stdint.h>
29 #include <stdbool.h>
30
31 #include <mach-o/loader.h>
32 #include <Availability.h>
33
34 #if __cplusplus
35 extern "C" {
36 #endif
37
38 #ifdef __DRIVERKIT_19_0
39 #define DYLD_DRIVERKIT_UNAVAILABLE __API_UNAVAILABLE(driverkit)
40 #else
41 #define DYLD_DRIVERKIT_UNAVAILABLE
42 #endif
43
44 /*
45 * The following functions allow you to iterate through all loaded images.
46 * This is not a thread safe operation. Another thread can add or remove
47 * an image during the iteration.
48 *
49 * Many uses of these routines can be replace by a call to dladdr() which
50 * will return the mach_header and name of an image, given an address in
51 * the image. dladdr() is thread safe.
52 */
53 extern uint32_t _dyld_image_count(void) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);
54 extern const struct mach_header* _dyld_get_image_header(uint32_t image_index) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);
55 extern intptr_t _dyld_get_image_vmaddr_slide(uint32_t image_index) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);
56 extern const char* _dyld_get_image_name(uint32_t image_index) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);
57
58
59 /*
60 * The following functions allow you to install callbacks which will be called
61 * by dyld whenever an image is loaded or unloaded. During a call to _dyld_register_func_for_add_image()
62 * the callback func is called for every existing image. Later, it is called as each new image
63 * is loaded and bound (but initializers not yet run). The callback registered with
64 * _dyld_register_func_for_remove_image() is called after any terminators in an image are run
65 * and before the image is un-memory-mapped.
66 */
67 extern void _dyld_register_func_for_add_image(void (*func)(const struct mach_header* mh, intptr_t vmaddr_slide)) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);
68 extern void _dyld_register_func_for_remove_image(void (*func)(const struct mach_header* mh, intptr_t vmaddr_slide)) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);
69
70
71 /*
72 * NSVersionOfRunTimeLibrary() returns the current_version number of the currently dylib
73 * specifed by the libraryName. The libraryName parameter would be "bar" for /path/libbar.3.dylib and
74 * "Foo" for /path/Foo.framework/Versions/A/Foo. It returns -1 if no such library is loaded.
75 */
76 extern int32_t NSVersionOfRunTimeLibrary(const char* libraryName) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);
77
78
79 /*
80 * NSVersionOfLinkTimeLibrary() returns the current_version number that the main executable was linked
81 * against at build time. The libraryName parameter would be "bar" for /path/libbar.3.dylib and
82 * "Foo" for /path/Foo.framework/Versions/A/Foo. It returns -1 if the main executable did not link
83 * against the specified library.
84 */
85 extern int32_t NSVersionOfLinkTimeLibrary(const char* libraryName) __OSX_AVAILABLE_STARTING(__MAC_10_1, __IPHONE_2_0);
86
87
88 /*
89 * _NSGetExecutablePath() copies the path of the main executable into the buffer. The bufsize parameter
90 * should initially be the size of the buffer. The function returns 0 if the path was successfully copied,
91 * and *bufsize is left unchanged. It returns -1 if the buffer is not large enough, and *bufsize is set
92 * to the size required.
93 *
94 * Note that _NSGetExecutablePath will return "a path" to the executable not a "real path" to the executable.
95 * That is the path may be a symbolic link and not the real file. With deep directories the total bufsize
96 * needed could be more than MAXPATHLEN.
97 */
98 extern int _NSGetExecutablePath(char* buf, uint32_t* bufsize) __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_2_0);
99
100
101
102 /*
103 * Registers a function to be called when the current thread terminates.
104 * Called by c++ compiler to implement destructors on thread_local object variables.
105 */
106 extern void _tlv_atexit(void (*termFunc)(void* objAddr), void* objAddr) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
107
108
109 /*
110 * Never called. On-disk thread local variables contain a pointer to this. Once
111 * the thread local is prepared, the pointer changes to a real handler such as tlv_get_addr.
112 */
113 extern void _tlv_bootstrap(void) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0) DYLD_DRIVERKIT_UNAVAILABLE ;
114
115 /*
116 * The following dyld API's are deprecated as of Mac OS X 10.5. They are either
117 * no longer necessary or are superceeded by dlopen and friends in <dlfcn.h>.
118 * dlopen/dlsym/dlclose have been available since Mac OS X 10.3 and work with
119 * dylibs and bundles.
120 *
121 * NSAddImage -> dlopen
122 * NSLookupSymbolInImage -> dlsym
123 * NSCreateObjectFileImageFromFile -> dlopen
124 * NSDestroyObjectFileImage -> dlclose
125 * NSLinkModule -> not needed when dlopen used
126 * NSUnLinkModule -> not needed when dlclose used
127 * NSLookupSymbolInModule -> dlsym
128 * _dyld_image_containing_address -> dladdr
129 * NSLinkEditError -> dlerror
130 *
131 */
132
133 #ifndef ENUM_DYLD_BOOL
134 #define ENUM_DYLD_BOOL
135 #undef FALSE
136 #undef TRUE
137 enum DYLD_BOOL { FALSE, TRUE };
138 #endif /* ENUM_DYLD_BOOL */
139
140
141 /* Object file image API */
142 typedef enum {
143 NSObjectFileImageFailure, /* for this a message is printed on stderr */
144 NSObjectFileImageSuccess,
145 NSObjectFileImageInappropriateFile,
146 NSObjectFileImageArch,
147 NSObjectFileImageFormat, /* for this a message is printed on stderr */
148 NSObjectFileImageAccess
149 } NSObjectFileImageReturnCode;
150
151 typedef struct __NSObjectFileImage* NSObjectFileImage;
152
153
154
155 /* NSObjectFileImage can only be used with MH_BUNDLE files */
156 extern NSObjectFileImageReturnCode NSCreateObjectFileImageFromFile(const char* pathName, NSObjectFileImage *objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlopen()");
157 extern NSObjectFileImageReturnCode NSCreateObjectFileImageFromMemory(const void *address, size_t size, NSObjectFileImage *objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
158 extern bool NSDestroyObjectFileImage(NSObjectFileImage objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlclose()");
159
160 extern uint32_t NSSymbolDefinitionCountInObjectFileImage(NSObjectFileImage objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
161 extern const char* NSSymbolDefinitionNameInObjectFileImage(NSObjectFileImage objectFileImage, uint32_t ordinal) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
162 extern uint32_t NSSymbolReferenceCountInObjectFileImage(NSObjectFileImage objectFileImage) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
163 extern const char* NSSymbolReferenceNameInObjectFileImage(NSObjectFileImage objectFileImage, uint32_t ordinal, bool *tentative_definition) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
164 extern bool NSIsSymbolDefinedInObjectFileImage(NSObjectFileImage objectFileImage, const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()");
165 extern void* NSGetSectionDataInObjectFileImage(NSObjectFileImage objectFileImage, const char* segmentName, const char* sectionName, size_t *size) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "getsectiondata()");
166
167 typedef struct __NSModule* NSModule;
168 extern const char* NSNameOfModule(NSModule m) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
169 extern const char* NSLibraryNameForModule(NSModule m) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
170
171 extern NSModule NSLinkModule(NSObjectFileImage objectFileImage, const char* moduleName, uint32_t options) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlopen()");
172 #define NSLINKMODULE_OPTION_NONE 0x0
173 #define NSLINKMODULE_OPTION_BINDNOW 0x1
174 #define NSLINKMODULE_OPTION_PRIVATE 0x2
175 #define NSLINKMODULE_OPTION_RETURN_ON_ERROR 0x4
176 #define NSLINKMODULE_OPTION_DONT_CALL_MOD_INIT_ROUTINES 0x8
177 #define NSLINKMODULE_OPTION_TRAILING_PHYS_NAME 0x10
178
179 extern bool NSUnLinkModule(NSModule module, uint32_t options) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
180 #define NSUNLINKMODULE_OPTION_NONE 0x0
181 #define NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED 0x1
182 #define NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES 0x2
183
184 /* symbol API */
185 typedef struct __NSSymbol* NSSymbol;
186 extern bool NSIsSymbolNameDefined(const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()");
187 extern bool NSIsSymbolNameDefinedWithHint(const char* symbolName, const char* libraryNameHint) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()");
188 extern bool NSIsSymbolNameDefinedInImage(const struct mach_header* image, const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()");
189 extern NSSymbol NSLookupAndBindSymbol(const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()");
190 extern NSSymbol NSLookupAndBindSymbolWithHint(const char* symbolName, const char* libraryNameHint) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()");
191 extern NSSymbol NSLookupSymbolInModule(NSModule module, const char* symbolName) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlsym()");
192 extern NSSymbol NSLookupSymbolInImage(const struct mach_header* image, const char* symbolName, uint32_t options) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlsym()");
193 #define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND 0x0
194 #define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_NOW 0x1
195 #define NSLOOKUPSYMBOLINIMAGE_OPTION_BIND_FULLY 0x2
196 #define NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR 0x4
197 extern const char* NSNameOfSymbol(NSSymbol symbol) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
198 extern void * NSAddressOfSymbol(NSSymbol symbol) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlsym()");
199 extern NSModule NSModuleForSymbol(NSSymbol symbol) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dladdr()");
200
201 /* error handling API */
202 typedef enum {
203 NSLinkEditFileAccessError,
204 NSLinkEditFileFormatError,
205 NSLinkEditMachResourceError,
206 NSLinkEditUnixResourceError,
207 NSLinkEditOtherError,
208 NSLinkEditWarningError,
209 NSLinkEditMultiplyDefinedError,
210 NSLinkEditUndefinedError
211 } NSLinkEditErrors;
212
213 /*
214 * For the NSLinkEditErrors value NSLinkEditOtherError these are the values
215 * passed to the link edit error handler as the errorNumber (what would be an
216 * errno value for NSLinkEditUnixResourceError or a kern_return_t value for
217 * NSLinkEditMachResourceError).
218 */
219 typedef enum {
220 NSOtherErrorRelocation,
221 NSOtherErrorLazyBind,
222 NSOtherErrorIndrLoop,
223 NSOtherErrorLazyInit,
224 NSOtherErrorInvalidArgs
225 } NSOtherErrorNumbers;
226
227 extern void NSLinkEditError(NSLinkEditErrors *c, int *errorNumber, const char** fileName, const char** errorString) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlerror()");
228
229 typedef struct {
230 void (*undefined)(const char* symbolName);
231 NSModule (*multiple)(NSSymbol s, NSModule oldModule, NSModule newModule);
232 void (*linkEdit)(NSLinkEditErrors errorClass, int errorNumber,
233 const char* fileName, const char* errorString);
234 } NSLinkEditErrorHandlers;
235
236 extern void NSInstallLinkEditErrorHandlers(const NSLinkEditErrorHandlers *handlers) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "");
237
238 extern bool NSAddLibrary(const char* pathName) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlopen()");
239 extern bool NSAddLibraryWithSearching(const char* pathName) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlopen()");
240 extern const struct mach_header* NSAddImage(const char* image_name, uint32_t options) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlopen()");
241 #define NSADDIMAGE_OPTION_NONE 0x0
242 #define NSADDIMAGE_OPTION_RETURN_ON_ERROR 0x1
243 #define NSADDIMAGE_OPTION_WITH_SEARCHING 0x2
244 #define NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED 0x4
245 #define NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME 0x8
246
247 extern bool _dyld_present(void) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "always true");
248 extern bool _dyld_launched_prebound(void) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "moot");
249 extern bool _dyld_all_twolevel_modules_prebound(void) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.3, 10.5, "moot");
250 extern bool _dyld_bind_fully_image_containing_address(const void* address) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlopen(RTLD_NOW)");
251 extern bool _dyld_image_containing_address(const void* address) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.3, 10.5, "dladdr()");
252 extern void _dyld_lookup_and_bind(const char* symbol_name, void **address, NSModule* module) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()");
253 extern void _dyld_lookup_and_bind_with_hint(const char* symbol_name, const char* library_name_hint, void** address, NSModule* module) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.4, "dlsym()");
254 extern void _dyld_lookup_and_bind_fully(const char* symbol_name, void** address, NSModule* module) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.1, 10.5, "dlsym()");
255
256 extern const struct mach_header* _dyld_get_image_header_containing_address(const void* address) __API_UNAVAILABLE(ios, tvos, watchos) __API_UNAVAILABLE(bridgeos) DYLD_DRIVERKIT_UNAVAILABLE __OSX_DEPRECATED(10.3, 10.5, "dladdr()");
257
258
259 #if __cplusplus
260 }
261 #endif
262
263 #endif /* _MACH_O_DYLD_H_ */