复习
1:macho文件
2:通用二进制文件
3:macho文件格式
4:dyld加载流程
目录
1:macho文件
2:通用二进制文件
3:macho文件格式
4:dyld加载流程
正文
一:macho文件】
1:mach-O文件
dylib:动态库
dyld: 动态连接器
Dysm:具有调试信息的符号信息
2:通用二进制文件、可执行文件。
1:CPU指令集
指令集对应的机型:
2019:
2018: A12芯片arm64e : iphone XS、 iphone XS Max、 iphoneXR
2017: A11芯片arm64: iPhone 8, iPhone 8 Plus, and iPhone X
2016: A10芯片arm64:iPhone 7 , 7 Plus, iPad (2018)
2015: A9芯片arm64: iPhone 6S , 6S Plus
2014: A8芯片arm64: iPhone 6 , iPhone 6 Plus
2013: A7芯片arm64: iPhone 5S
armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4
模拟器32位处理器测试需要i386架构,
模拟器64位处理器测试需要x86_64架构,
真机32位处理器需要armv7,或者armv7s架构,
真机64位处理器需要arm64架构。
2:通用二进制文件”或“ Fat Binaries“胖二进制文件。
根据支持的目标设备和操作系统版本改变。
通用二进制文件可以,在iOS,tvOS和watchOS上,还可以在Simulator中运行。
3:通用二进制文件
4:查看可执行文件
4.1:查看可执行文件
lipo -info ***
***是可执行文件的名字
4.2:拆分可执行文件
lipo *** -thin armv7 -output ***_armv7
*** 是原有的可执行文件的名字
***_armv7 是拆分后的可执行文件的名字。
4.3:合并可执行文件
lipo -create ***_armv7 ***_arm64 -output ***_demo
***_armv7
***_arm6
是两个拆分的可执行文件
***_demo是合并后的可执行文件。
二:Macho文件格式
1:header:
2:loadCommands
LC_DYLD_INFO_ONLY:动态链接
重定向、绑定、弱绑定、懒加载绑定、对外开发。
LC_DYSYMTAB:动态符号表地址。(这部分之系统内核加载的。之后是动态连接器加载的)
LC_LOAD_DYLINKER:动态连接器
LC_MAIN: 程序入口
LC_ENCRYPTION_INFO:加密信息
三:dyld: 动态链接器
DYLD:流程图:函数调用栈
dyld 加载所有的库和可执行文件信息。
1:程序是从_dyld_start开始
2:进入dyld:main函数
2.1:配置环境:配置DYLD_PRINT_OPTS 环境变量,RUN->Arguments-> EnvironmentVariables。
DYLD_PRINT_OPTS 1
DYLD_PRINT_ENV 1
2.2:加载共享缓存库
2.3:实例化主程序
加载mach-o文件
2.4:加载动态库
2.5:链接主程序、
2.6:符号绑定
2.7:初始化主函数(最关键的)
2.7.1:经过一系列初始化函数后是:notifySingle函数
执行一个回调。
通过断点调试,执行一个回调,回调函数是被objc_init初始化时赋值的一个函数loadImage
objc_init
loadImage
callloadMethods:循环遍历各个类的load方法
callclassLoads:
2.7.2:doModInitFunction函数
调用全局C++对象的构造函数带有__Sttribute__((constructor))的c函数。
2.7.3:返回主程序的入库函数。 main函数。
注意
load方法
c++构造函数
main函数