iOS开发:Mach-O入门理解

1、目标文件Mach-O

Mach-O:是Mach object的缩写,是Mac\iOS上用于存储程序、库的标准格式。

属于Mach-O格式的文件类型有:

#define MH_OBJECT   0x1     /* Target 文件:编译器对源码编译后得到的中间结果 */
#define MH_EXECUTE  0x2     /* 可执行二进制文件 */
#define MH_FVMLIB   0x3     /* VM 共享库文件(还不清楚是什么东西) */
#define MH_CORE     0x4     /* Core 文件,一般在 App Crash 产生 */
#define MH_PRELOAD  0x5     /* preloaded executable file */
#define MH_DYLIB    0x6     /* 动态库 */
#define MH_DYLINKER 0x7     /* 动态连接器 /usr/lib/dyld */
#define MH_BUNDLE   0x8     /* 非独立的二进制文件,往往通过 gcc-bundle 生成 */
#define MH_DYLIB_STUB   0x9     /* 静态链接文件(还不清楚是什么东西) */
#define MH_DSYM     0xa     /* 符号文件以及调试信息,在解析堆栈符号中常用 */
#define MH_KEXT_BUNDLE  0xb     /* x86_64 内核扩展 */

可以在xnu源码中,可以查看到Mach-O格式的详细定义(https://opensource.apple.com/tarballs/xnu/

EXTERNAL_HEADERS/mach-o/fat.h
EXTERNAL_HEADERS/mach-o/loader.h

2、常见的Mach-O文件类型

1、MH_OBJECT

1、目标文件(.o)
2、静态库文件(.a),静态库其实就是N个.o合并在一起的

2、MH_EXECUTE:可执行文件

.app/xx

3、MH_DYLIB:动态库文件

.dylib
.framework/xx

4、MH_DYLINKER:动态链接编辑器

/usr/lib/dyld

5、MH_DSYM:存储着二进制文件符号信息的文件

.dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩溃信息)

.o文件编译生成的流程:
在这里插入图片描述

4、在Xcode中查看target的Mach-O类型

在这里插入图片描述

4、Mach-O的基本结构

官方描述
https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/MachOTopics/0-Introduction/introduction.html

一个Mach-O文件包含3个主要区域:
1、Header :保存文件的基本信息,如文件类型、CPU架构信息、加载命令个数等。
2、Load commands:根据这里的数据确定内存分布(本身不包含数据,类似于一个指针)。
3、Raw segment data:存放具体的代码和数据,是Mach-O文件真正的内容数据。

在这里插入图片描述

5、如何窥探Mach-O的结构

一、命令行工具:
1、file:查看Mach-O的文件类型

file  文件路径

2、otool:查看Mach-O特定部分和段的内容

3、lipo:常用于多架构Mach-O文件的处理
3.1、查看架构信息:lipo -info 文件路径
3.2、导出某种特定架构:lipo 文件路径 -thin 架构类型 -output 输出文件路径
3.3、合并多种架构:lipo 文件路径1 文件路径2 -output 输出文件路径

二、GUI工具
MachOView(https://github.com/gdbinit/MachOView

6、Universal Binary(通用二进制文件)

通用二进制文件

同时适用于多种架构的二进制文件
包含了多种不同架构的独立的二进制文件

二进制文件特点:
1、因为需要储存多种架构的代码,通用二进制文件通常比单一平台二进制的程序要大。
2、由于两种架构有共同的一些资源,所以并不会达到单一版本的两倍之多。
3、由于执行过程中,只调用一部分代码,运行起来也不需要额外的内存。
4、因为文件比原来的要大,也被称为“胖二进制文件”(Fat Binary)。

7、动态加载器dyld与目标文件Mach-O的关系

1、动态加载器dyld可用于加载以下类型的Mach-O文件

MH_EXECUTE
MH_DYLIB
MH_BUNDLE

2、APP的可执行文件、动态库都是由dyld负责加载的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜子三百克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值