dyld源码分析-动态加载load

0x00 摘要

OS X或者IOS上运行一个程序时,dyld除了需要加载主要的执行程序之外,还需要加载需要的库文件以及库文件依赖的库文件。

1
2
// instantiate ImageLoader for main executable
sMainExecutable = instantiateFromLoadedImage(mainExecutableMH, mainExecutableSlide, sExecPath);//加载MACHO到image

这一条函数调用加载了需要运行的程序,具体详细分析可以参考dyld中mach-o文件加载的简单分析

而在link主程序之前还会动态的加载一些其他的库文件。例如DYLD_INSERT_LIBRARIES

1
2
3
4
5
6
7
8
9
// load any inserted libraries
// 类似于linux里面的LD_PRELOAD
if ( sEnv.DYLD_INSERT_LIBRARIES != NULL ) {
for (const char* const* lib = sEnv.DYLD_INSERT_LIBRARIES; *lib != NULL; ++lib)
loadInsertedDylib(*lib); //!!!动态加载dylib
}
// record count of inserted libraries so that a flat search will look at
// inserted libraries, then main, then others.
sInsertedDylibCount = sAllImages.size()-1;

loadInsertedDylib的实现其实就是简单的调用load函数。通过简单的分析load函数,增强对dyld工作流程的理解。

mach-o格式分析

0x00 摘要

人生无根蒂,飘如陌上尘。 分散逐风转,此已非常身。

— 陶渊明 《杂诗》

mach-o格式是OS X系统上的可执行文件格式,类似于windows的PE与linux的ELF,如果不彻底搞清楚mach-o的格式与相关知识,去做其他研究,无异于建造空中阁楼。

每个Mach-O文件斗包含一个Mach-O头,然后是载入命令(Load Commands),最后是数据块(Data)。

接下来就对整个Mach-O的格式做出详细的分析。

OS X 内核研究 准备知识

0x00 内容简介

子贡问为仁。子曰:“工欲善其事,必先利其器。居是邦也,事其大夫之贤者,友其士之仁者。”
—《论语·卫灵公》

​ 在开始研究OSX内核以及与OSX相关知识之前,需要对OSX有一个比较全面的认识,将一些简单的概念搞清楚。

,