libdyldEntryVector.cpp [plain text]
#include <stdarg.h>
#include "dyld_priv.h"
#include "libdyldEntryVector.h"
#include "AllImages.h"
#include "Logging.h"
#include "PathOverrides.h"
#include "LaunchCacheFormat.h"
#include "start_glue.h"
extern "C" void start();
VIS_HIDDEN const char** appleParams;
extern bool gUseDyld3;
namespace dyld3 {
AllImages::ProgramVars sVars;
static void (*sChildForkFunction)();
static const char* leafName(const char* argv0)
{
if ( argv0 == nullptr )
return "";
if ( const char* lastSlash = strrchr(argv0, '/') )
return lastSlash+1;
else
return argv0;
}
static void entry_setVars(const mach_header* mainMH, int argc, const char* argv[], const char* envp[], const char* apple[])
{
NXArgc = argc;
NXArgv = argv;
environ = (char**)envp;
appleParams = apple;
__progname = leafName(argv[0]);
sVars.mh = mainMH;
sVars.NXArgcPtr = &NXArgc;
sVars.NXArgvPtr = &NXArgv;
sVars.environPtr = (const char***)&environ;
sVars.__prognamePtr = &__progname;
gAllImages.setProgramVars(&sVars);
gUseDyld3 = true;
setLoggingFromEnvs(envp);
}
static void entry_setHaltFunction(void (*func)(const char* message) __attribute__((noreturn)) )
{
setHaltFunction(func);
}
static void entry_setLogFunction(void (*logFunction)(const char* format, va_list list))
{
setLoggingFunction(logFunction);
}
static void entry_setOldAllImageInfo(dyld_all_image_infos* old)
{
gAllImages.setOldAllImageInfo(old);
}
static void entry_setInitialImageList(const launch_cache::binary_format::Closure* closure,
const void* dyldCacheLoadAddress, const char* dyldCachePath,
const dyld3::launch_cache::DynArray<loader::ImageInfo>& initialImages,
const mach_header* libSystemMH, const launch_cache::binary_format::Image* libSystemImage)
{
gAllImages.init(closure, dyldCacheLoadAddress, dyldCachePath, initialImages);
gAllImages.applyInterposingToDyldCache(closure, initialImages);
const char* mainPath = _simple_getenv(appleParams, "executable_path");
if ( (mainPath != nullptr) && (mainPath[0] == '/') )
gAllImages.setMainPath(mainPath);
gAllImages.setInitialGroups();
gAllImages.runLibSystemInitializer(libSystemMH, libSystemImage);
gPathOverrides.setEnvVars((const char**)environ);
}
static void entry_runInitialzersBottomUp(const mach_header* mainExecutableImageLoadAddress)
{
gAllImages.runInitialzersBottomUp(mainExecutableImageLoadAddress);
gAllImages.notifyMonitorMain();
}
static void entry_setChildForkFunction(void (*func)() )
{
sChildForkFunction = func;
}
typedef void (*StartFunc)();
const LibDyldEntryVector entryVectorForDyld = {
LibDyldEntryVector::kCurrentVectorVersion,
launch_cache::binary_format::kFormatVersion,
&entry_setVars,
&entry_setHaltFunction,
&entry_setOldAllImageInfo,
&entry_setInitialImageList,
&entry_runInitialzersBottomUp,
(StartFunc)address_of_start,
&entry_setChildForkFunction,
&entry_setLogFunction,
};
VIS_HIDDEN void _dyld_fork_child()
{
(*sChildForkFunction)();
}
}