我们在开发静态库/动态库时候,是通过Mach-O指定其是静态库/动态库的类型,那么Mach-O几种类型分别指的是什么呢?
先说说Mach-O
Mach-O是Mach目标文件格式的缩写,是一种用于可执行文件、目标代码、共享库、动态加载代码和核心转储的文件格式,(有点像Unix中的a.out的改进版本)是macOS X和iPhoneOS库中用于可执行文件的格式。
我们大家都知道,iOS设备有不同架构ARMv6、ARMv7,以及XCode模拟器的i386架构,这意味着必须为设备和模拟器设立独立的目标库。
OS X 支持许多应用程序环境,每个环境都有自己的运行时规则、约定和文件格式。在 OS X 中,内核扩展、命令行工具、应用程序、框架和库(共享和静态)是使用 Mach-O(Mach 对象)文件实现的。
OS X 运行时架构决定了目标文件在文件系统中的布局方式以及程序与内核的通信方式。OS X 中使用的目标文件格式是 Mach-O 。
Mach-O 文件具有以下数据区域(完整格式在OS X ABI Mach-O 文件格式参考中描述):
- Header: 指定文件的目标架构,例如 PPC、PPC64、IA-32 或 x86-64。
- 加载命令: 指定文件的逻辑结构和文件在虚拟内存中的布局。
- 原始段数据: 包含加载命令中定义的段的原始数据。
Mach-O的不同类型定义
Executable- 已编译的机器目标程序,准备好以二进制格式运行。Dynamic Library- 在运行时链接 - 引用动态库的程序将在启动时(或按需)加载并与库链接。Bundles- 捆绑包标识符让 iOS 和 OSX 能够识别您的应用程序的任何更新。它使其在应用程序中具有独特的存在感。Static Library- 文件在构建时链接。代码被复制到可执行文件中。程序未引用的库中的代码将被删除。只有静态库的程序在运行时没有任何依赖关系。Relocatable Object File- 是动态库的另一个词。当您与动态库链接时,会根据库在内存中的加载位置计算其中包含的函数的地址。它们是“可重定位的”,因为包含函数的地址不是在链接时确定的。(在静态库中,地址是在链接时计算的。)
参考: