小记 关于Mach-o的个人理解
最近想深度研究一下iOS的运行啊 底层啊 什么的,但是很多东西都不懂,比如这个Mach-o、i386,x86_64,armv6,armv7等等……一系列东西,现在就把自己理解的东西,小记一下;
通过网上的查阅 Mach-o是一种二进制文件格式,全称是Mach Object,它是一种用于记录可执行文件、对象代码、共享库、动态加载代码和内存转储的文件格式大多数基于 Mach 内核的操作系统都使用 Mach-O。NeXTSTEP、OS X 和 iOS 是使用这种格式作为本地可执行文件、库和对象代码的例子。
Mach-o包括3个部分
1.Header-包含该二进制文件的一般信息:字节顺序、(魔数)、cpu 类型、加载指令的数量等等。
2.(LoadCommants)加载指令-它是一张包含很多内容的表,内容包括区域的位置、符号表、动态符号表等。每个加载指令都包含一个元信息,比如指令类型、名称、在二进制文件中的位置等等。
3.(Data)数据-通常是对象文件中最大的部分。主要包含代码、数据,例如符号表,动态符号表等等
OS X 有两种类型的目标文件:Mach-O 文件和通用二进制文件,也叫作胖文件。它们之间的区别是:Mach-O 文件包含一种架构(i386、x86_64、arm64 等等)的对象代码,而胖文件可能包含若干包含不同架构(i386、x86_64、arm、arm64 等等)对象代码的对象文件。可以理解成胖文件包含很多Mach-o文件
接下来 了解一下上面所说的 i386,x86_64
armv7|armv7s|arm64都是ARM处理器的指令集
i386|x86_64 是Mac处理器的指令集
i386是针对intel通用微处理器32位处理器
x86_64是针对x86架构的64位处理器
模拟器32位处理器测试需要i386架构,
模拟器64位处理器测试需要x86_64架构,
真机32位处理器需要armv7,或者armv7s架构,
真机64位处理器需要arm64架构。
了解dyld (动态链接器)
在iOS系统中,每个程序依赖的动态库都需要通过dyld(位于/usr/lib/dyld)一个一个加载到内存,然而,很多系统库几乎是每个程序都会用到的,如果在每个程序运行的时候都重复的去加载一次,势必造成运行缓慢,为了优化启动速度和提高程序性能,共享缓存机制就应运而生。所有默认的动态链接库被合并成一个大的缓存文件,放到/System/Library/Caches/com.apple.dyld/目录下,按不同的架构保存分别保存着