1/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*- 2 * 3 * Copyright (c) 2004-2009 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#include <stdint.h> 26#include <sys/stat.h> 27 28#include "ImageLoader.h" 29#include "mach-o/dyld_priv.h" 30 31 32 33// 34// dyld functions available when implementing dyld API's 35// 36// 37namespace dyld { 38 39 struct LoadContext 40 { 41 bool useSearchPaths; 42 bool useFallbackPaths; 43 bool useLdLibraryPath; 44 bool implicitRPath; 45 bool matchByInstallName; 46 bool dontLoad; 47 bool mustBeBundle; 48 bool mustBeDylib; 49 bool canBePIE; 50 const char* origin; // path for expanding @loader_path 51 const ImageLoader::RPathChain* rpath; // paths for expanding @rpath 52 }; 53 54 55 56 typedef void (*ImageCallback)(const struct mach_header* mh, intptr_t slide); 57 typedef void (*UndefinedHandler)(const char* symbolName); 58 typedef const char* (*ImageLocator)(const char* dllName); 59 60 61 extern ImageLoader::LinkContext gLinkContext; 62 extern struct dyld_all_image_infos* gProcessInfo; 63 extern bool gLogAPIs; 64#if DYLD_SHARED_CACHE_SUPPORT 65 extern bool gSharedCacheOverridden; 66#endif 67 extern const struct LibSystemHelpers* gLibSystemHelpers; 68#if SUPPORT_OLD_CRT_INITIALIZATION 69 extern bool gRunInitializersOldWay; 70#endif 71 extern void registerAddCallback(ImageCallback func); 72 extern void registerRemoveCallback(ImageCallback func); 73 extern void registerUndefinedHandler(UndefinedHandler); 74 extern void initializeMainExecutable(); 75 extern void preflight(ImageLoader* image, const ImageLoader::RPathChain& loaderRPaths); 76 extern void link(ImageLoader* image, bool forceLazysBound, bool neverUnload, const ImageLoader::RPathChain& loaderRPaths); 77 extern void runInitializers(ImageLoader* image); 78 extern void runImageStaticTerminators(ImageLoader* image); 79 extern const char* getExecutablePath(); 80 extern bool validImage(const ImageLoader*); 81 extern ImageLoader* getIndexedImage(uint32_t index); 82 extern uint32_t getImageCount(); 83 extern ImageLoader* findImageByMachHeader(const struct mach_header* target); 84 extern ImageLoader* findImageContainingAddress(const void* addr); 85 extern ImageLoader* findImageContainingSymbol(const void* symbol); 86 extern ImageLoader* findImageByName(const char* path); 87 extern ImageLoader* findLoadedImageByInstallPath(const char* path); 88 extern bool flatFindExportedSymbol(const char* name, const ImageLoader::Symbol** sym, const ImageLoader** image); 89 extern bool flatFindExportedSymbolWithHint(const char* name, const char* librarySubstring, const ImageLoader::Symbol** sym, const ImageLoader** image); 90 extern ImageLoader* load(const char* path, const LoadContext& context); 91 extern ImageLoader* loadFromMemory(const uint8_t* mem, uint64_t len, const char* moduleName); 92 extern void removeImage(ImageLoader* image); 93 extern ImageLoader* cloneImage(ImageLoader* image); 94 extern void forEachImageDo( void (*)(ImageLoader*, void*), void*); 95 extern uintptr_t _main(const macho_header* mainExecutableMH, uintptr_t mainExecutableSlide, int argc, const char* argv[], const char* envp[], 96 const char* apple[], uintptr_t* startGlue) __attribute__((noinline)); // <rdar://problem/113 97 extern void halt(const char* message) __attribute__((noreturn)); 98 extern void setErrorMessage(const char* msg); 99 extern const char* getErrorMessage(); 100 extern void clearErrorMessage(); 101 extern bool mainExecutablePrebound(); 102 extern ImageLoader* mainExecutable(); 103 extern void processDyldEnvironmentVariable(const char* key, const char* value, const char* mainDir); 104 extern void registerImageStateSingleChangeHandler(dyld_image_states state, dyld_image_state_change_handler handler); 105 extern void registerImageStateBatchChangeHandler(dyld_image_states state, dyld_image_state_change_handler handler); 106 extern void garbageCollectImages(); 107 extern int openSharedCacheFile(); 108 extern const void* imMemorySharedCacheHeader(); 109 extern uintptr_t fastBindLazySymbol(ImageLoader** imageLoaderCache, uintptr_t lazyBindingInfoOffset); 110#if DYLD_SHARED_CACHE_SUPPORT 111 extern bool inSharedCache(const char* path); 112#endif 113#if LOG_BINDINGS 114 extern void logBindings(const char* format, ...); 115#endif 116 extern bool processIsRestricted(); 117 extern int my_stat(const char* path, struct stat* buf); 118 extern int my_open(const char* path, int flag, int other); 119} 120 121