本文主要介绍Mach-O文件格式
以及通用二进制文件
Mach-O文件概述
-
Mach-O其实是
Mach Object
文件格式的缩写,是mac以及iOS上可执行文件的格式, 类似于windows上的PE
格式 (Portable Executable ), linux上的elf
格式 (Executable and Linking Format) -
Mach-O是一种
用于可执行文件、目标代码、动态库的文件格式
。作为a.out格式的替代,Mach-O提供了更强的扩展性。
Mach-O文件格式
常见的Mach-O格式有以下几种
-
1、目标文件
.o
-
2、库文件,细分主要有以下几种:
-
.a
-
.dylib
-
.framework
-
-
3、可执行文件
-
4、
dyld
-
5、
.dsym
我们可以通过终端的file指令来查看文件的类型
1、目标文件.o
- 1、新建一个C文件
#include <stdio.h>
int main(){
printf("test\n");
return 0;
}
-
2、通过
clang
命令编译C文件
-
查看文件夹:
ls
-
clang -c test.c
: 将.c文件编译成.o文件(OC在后端中使用的是LLVM编译,而前端使用的工具是clang,即理解为 LLVM包含clang)。 -
file test.o
:查看文件类型 - Mach-O文件、64位、x86_64架构 -
clang test.o
:将.o文件编译成可执行文件 -
./a.out
:执行可执行文件
-
-
3、也可以通过一行命令将c文件编译成可执行文件:
clang -o test2 test.c
-
重复3的操作,再次生成一个可执行文件 test3。此时问题来了,这三个可执行文件(即
a、test2、test3
)是否是一样的?我们可以通过md5
验证,如果hash值一样则说明是一样的,反之不一样
中间产物.o文件
其中.c
到.out
文件的区别是中间多了一个.o
文件。而在我们的实际开发中,其实是有多个源码的,所以最终的可执行文件是由多个源码
生成的,如下所示,将两个.o文件编译成一个可执行文件
-
通过clang生成.o文件:
clang -c test1.c test.c
-
通过clang将.o文件编译成可执行文件:
clang -o demo1 test1.o test.o
-
如果此时换一下链接顺序呢?,例如:
clang -o demo2 test.o test1.o
-
多个源码一次性生成可执行文件:
clang -o demo test1.c test.c
-
对比上述生成的三个可执行文件,是否是同一个?这里我们也通过
md5
生成的hash值进行对比结论:通过对比发现,如果改变了.o文件的连接顺序,那么Mach-O的也会随之发生变化
-
这里可以通过
objdump
查看Mach-o链接顺序,例如:-
objdump --macho -d demo
+objdump --macho -d demo1
,这里demo和demo1的源文件链接顺序是test1 + main
-