-
内存分为
不可访问区域
、.text
、.data
、.bss
、堆区
、共享库
、.stack
、内核区
; -
全局变量、静态变量在数据段,其中已初始化并且初始化值不为
0
的.data
段,初始化为0
或者未初始化的在.bss
段,函数中的变量(即指令)放在了.text
段; -
main
函数第一个参数是命令行参数个数,第二个是命令行参数; -
.bss
占用的是虚拟内存的空间,不占用mach-o
文件的空间; -
mach-o
的header
中存了.bss
占多少空间; -
链接时只处理
mach-o
文件中的global
符号,不处理local
符号(比如文件中的static
变量); -
链接过程:
a. 按属性(比如
.data/.text
)合并所有mach-o
文件的段(即合并同名section
为segment
) -> 并调整段偏移和段长度 -> 合并符号表 -> 进行符号解析 -> 分配内存地址;b.由于编译过程中不会给符号分配地址,所以链接阶段要进行符号重定位(数据符号替换成真正的地址,函数符号替换成与下一行指令地址的偏移量);
-
mach-o
中函数存的是偏移量,pc寄存器
中存的是下一行指令的地址,跳转时我们需要用当前的指令偏移 +pc指令
地址,即是要跳转到的函数地址;