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