Mach-O
概念
Mach-O 官方文档:https://github.com/aidansteele/osx-abi-macho-file-format-reference/blob/master/Mach-O_File_Format.pdf
Mach-O 源码:https://github.com/apple/darwin-xnu/blob/main/EXTERNAL_HEADERS/mach-o/loader.h
Mach-O 文件格式:

查看 Mach-O 的工具:https://github.com/fangshufeng/MachOView
Header

Load Commands
Load Commands 是告诉 dyld 怎么把这个 Mach-O 加载到内存并运行的指令表。每一条命令都有自己的类型和大小,告诉 dyld 要执行一个特定的任务。程序启动时,dyld 读取 Mach-O 文件的 Load Commands,并根据这些命令一条一条地执行,最终把这个磁盘上的文件,变成一个可以在内存中运行的进程。

以下是一些最重要的 Load Commands 及其作用:
内存布局映射 (LC_SEGMENT_64): 这是最基本、最重要的命令之一。它告诉 dyld 把文件中的这一块数据,映射到内存的这个虚拟地址上。
__TEXT段:包含可执行代码、只读数据等。内存权限为只读+可执行 (r-x),防止代码被意外篡改。__DATA段:包含可读写的数据,比如全局变量、静态变量等。内存权限为可读+可写 (rw-)。__LINKEDIT段:包含链接时需要的信息,如符号表、字符串表、重定位信息、代码签名等。内存权限为可读 (r)。vmaddr: 这个 Segment 被加载到内存后,它应该被放置在的虚拟地址。这是程序链接时就已经计算和分配好的一个理想地址。vmsize: 这个 Segment 在内存中总共需要多大的空间。这个值通常会向上取整到系统内存页(Page)的整数倍(在 ARM64 上是 16KB)。fileoff: 这个 Segment 的内容是从 Mach-O 文件的第几个字节开始的。
动态库加载 (LC_LOAD_DYLIB): 这条命令告诉 dyld 本程序依赖于某个动态库,请在启动时找到并加载它。