#include <stdint.h>
#include <sys/stat.h>
#include "ImageLoader.h"
#include "mach-o/dyld_priv.h"
namespace dyld {
struct LoadContext
{
bool useSearchPaths;
bool useFallbackPaths;
bool useLdLibraryPath;
bool implicitRPath;
bool matchByInstallName;
bool dontLoad;
bool mustBeBundle;
bool mustBeDylib;
bool canBePIE;
const char* origin; const ImageLoader::RPathChain* rpath; };
typedef void (*ImageCallback)(const struct mach_header* mh, intptr_t slide);
typedef void (*UndefinedHandler)(const char* symbolName);
typedef const char* (*ImageLocator)(const char* dllName);
extern ImageLoader::LinkContext gLinkContext;
extern struct dyld_all_image_infos* gProcessInfo;
extern bool gLogAPIs;
#if DYLD_SHARED_CACHE_SUPPORT
extern bool gSharedCacheOverridden;
#endif
extern const struct LibSystemHelpers* gLibSystemHelpers;
#if SUPPORT_OLD_CRT_INITIALIZATION
extern bool gRunInitializersOldWay;
#endif
extern void registerAddCallback(ImageCallback func);
extern void registerRemoveCallback(ImageCallback func);
extern void registerUndefinedHandler(UndefinedHandler);
extern void initializeMainExecutable();
extern void preflight(ImageLoader* image, const ImageLoader::RPathChain& loaderRPaths);
extern void link(ImageLoader* image, bool forceLazysBound, bool neverUnload, const ImageLoader::RPathChain& loaderRPaths);
extern void runInitializers(ImageLoader* image);
extern void runImageStaticTerminators(ImageLoader* image);
extern const char* getExecutablePath();
extern bool validImage(const ImageLoader*);
extern ImageLoader* getIndexedImage(uint32_t index);
extern uint32_t getImageCount();
extern ImageLoader* findImageByMachHeader(const struct mach_header* target);
extern ImageLoader* findImageContainingAddress(const void* addr);
extern ImageLoader* findImageContainingSymbol(const void* symbol);
extern ImageLoader* findImageByName(const char* path);
extern ImageLoader* findLoadedImageByInstallPath(const char* path);
extern bool flatFindExportedSymbol(const char* name, const ImageLoader::Symbol** sym, const ImageLoader** image);
extern bool flatFindExportedSymbolWithHint(const char* name, const char* librarySubstring, const ImageLoader::Symbol** sym, const ImageLoader** image);
extern ImageLoader* load(const char* path, const LoadContext& context);
extern ImageLoader* loadFromMemory(const uint8_t* mem, uint64_t len, const char* moduleName);
extern void removeImage(ImageLoader* image);
extern ImageLoader* cloneImage(ImageLoader* image);
extern void forEachImageDo( void (*)(ImageLoader*, void*), void*);
extern uintptr_t _main(const macho_header* mainExecutableMH, uintptr_t mainExecutableSlide, int argc, const char* argv[], const char* envp[],
const char* apple[], uintptr_t* startGlue) __attribute__((noinline)); extern void halt(const char* message) __attribute__((noreturn));
extern void setErrorMessage(const char* msg);
extern const char* getErrorMessage();
extern void clearErrorMessage();
extern bool mainExecutablePrebound();
extern ImageLoader* mainExecutable();
extern void processDyldEnvironmentVariable(const char* key, const char* value, const char* mainDir);
extern void registerImageStateSingleChangeHandler(dyld_image_states state, dyld_image_state_change_handler handler);
extern void registerImageStateBatchChangeHandler(dyld_image_states state, dyld_image_state_change_handler handler);
extern void garbageCollectImages();
extern int openSharedCacheFile();
extern const void* imMemorySharedCacheHeader();
extern uintptr_t fastBindLazySymbol(ImageLoader** imageLoaderCache, uintptr_t lazyBindingInfoOffset);
#if DYLD_SHARED_CACHE_SUPPORT
extern bool inSharedCache(const char* path);
#endif
#if LOG_BINDINGS
extern void logBindings(const char* format, ...);
#endif
extern bool processIsRestricted();
extern int my_stat(const char* path, struct stat* buf);
extern int my_open(const char* path, int flag, int other);
}