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