本文主要介绍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的源文
-

本文详细介绍了iOS中的Mach-O文件格式,包括目标文件、库文件(静态库与动态库)、可执行文件、dyld动态链接器以及.dsym文件。探讨了静态库与动态库的区别,以及如何通过终端命令验证文件类型。此外,还讲解了通用二进制文件的概念,用于解决不同硬件平台的兼容性问题,并展示了如何使用lipo命令进行拆分和合并。
最低0.47元/天 解锁文章
909

被折叠的 条评论
为什么被折叠?



