#include <stdint.h>
#include "ImageLoader.h"
#include "mach-o/dyld_priv.h"
namespace dyld {
struct LoadContext
{
bool useSearchPaths;
bool useLdLibraryPath;
bool implicitRPath;
bool matchByInstallName;
bool dontLoad;
bool mustBeBundle;
bool mustBeDylib;
bool findDLL;
const char* origin; const ImageLoader::RPathChain* rpath; };
typedef void (*ImageCallback)(const struct mach_header* mh, intptr_t slide);
typedef void (*BundleNotificationCallBack)(const char* imageName, ImageLoader* image);
typedef ImageLoader* (*BundleLocatorCallBack)(const char* symbolName);
typedef void (*UndefinedHandler)(const char* symbolName);
typedef const char* (*ImageLocator)(const char* dllName);
extern ImageLoader::LinkContext gLinkContext;
extern bool gLogAPIs;
extern bool gSharedCacheNotFound;
extern bool gSharedCacheNeedsUpdating;
extern bool gSharedCacheDontNotify;
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 registerZeroLinkHandlers(BundleNotificationCallBack, BundleLocatorCallBack);
extern void registerUndefinedHandler(UndefinedHandler);
extern void initializeMainExecutable();
extern void preflight(ImageLoader* image, const ImageLoader::RPathChain& loaderRPaths);
extern void link(ImageLoader* image, bool forceLazysBound, const ImageLoader::RPathChain& loaderRPaths);
extern void runInitializers(ImageLoader* image);
extern void runTerminators(void*);
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* 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 struct mach_header* mainExecutableMH, uintptr_t mainExecutableSlide, int argc, const char* argv[], const char* envp[], const char* apple[]);
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 processDyldEnvironmentVarible(const char* key, const char* value);
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();
};