// // This is code to bootstrap dyld. This work in normally done for a program by dyld and crt. // In dyld we have to do this manually. // uintptr_t start(const struct macho_header* appsMachHeader, int argc, const char* argv[], intptr_t slide, const struct macho_header* dyldsMachHeader, uintptr_t* startGlue) { // if kernel had to slide dyld, we need to fix up load sensitive locations // we have to do this before using any global variables if ( slide != 0 ) { rebaseDyld(dyldsMachHeader, slide); } // allow dyld to use mach messaging mach_init(); // kernel sets up env pointer to be just past end of agv array const char** envp = &argv[argc+1]; // kernel sets up apple pointer to be just past end of envp array const char** apple = envp; while(*apple != NULL) { ++apple; } ++apple; // set up random value for stack canary __guard_setup(apple); #if DYLD_INITIALIZER_SUPPORT // run all C++ initializers inside dyld runDyldInitializers(dyldsMachHeader, slide, argc, argv, envp, apple); #endif // now that we are done bootstrapping dyld, call dyld's main uintptr_t appsSlide = slideOfMainExecutable(appsMachHeader); return dyld::_main(appsMachHeader, appsSlide, argc, argv, envp, apple, startGlue); }
uintptr_t start_sim(int argc, const char* argv[], const char* envp[], const char* apple[], const macho_header* mainExecutableMH, const macho_header* dyldMH, uintptr_t dyldSlide, const dyld::SyscallHelpers* sc, uintptr_t* startGlue) { // if simulator dyld loaded slid, it needs to rebase itself // we have to do this before using any global variables if ( dyldSlide != 0 ) { rebaseDyld(dyldMH, dyldSlide); } // save table of syscall pointers gSyscallHelpers = sc; // allow dyld to use mach messaging mach_init(); // set up random value for stack canary __guard_setup(apple); // setup gProcessInfo to point to host dyld's struct dyld::gProcessInfo = (struct dyld_all_image_infos*)(sc->getProcessInfo()); syncProcessInfo(); // now that we are done bootstrapping dyld, call dyld's main uintptr_t appsSlide = slideOfMainExecutable(mainExecutableMH); return dyld::_main(mainExecutableMH, appsSlide, argc, argv, envp, apple, startGlue); }
void init(void) { memcpy(__data_begin__, __rodata_end__, __data_end__ - __data_begin__); memset(__bss_begin__, 0, __bss_end__ - __bss_begin__); mach_init(); set_trap_handler(); tlb_init(); pcb_init(); main(); }