目录

《程序员的自我修养》笔记

视频

笔记

  1. 内存分为不可访问区域.text.data.bss堆区共享库.stack内核区

  2. 全局变量、静态变量在数据段,其中已初始化并且初始化值不为0.data段,初始化为0或者未初始化的在.bss段,函数中的变量(即指令)放在了.text段;

  3. main函数第一个参数是命令行参数个数,第二个是命令行参数;

  4. .bss占用的是虚拟内存的空间,不占用mach-o文件的空间;

  5. mach-oheader中记录了.bss要占多少空间;

  6. mach-o中函数存的是偏移量,pc寄存器中存的是下一行指令的地址,跳转时需要用当前的指令偏移 + pc指令地址,才是我们要跳转到的函数地址;

  7. 链接时只处理mach-o文件中的global符号,不处理local符号(比如文件中的static变量);

  8. 链接过程:

    a. 按属性(比如.data / .text)合并所有mach-o文件的段(即合并同名sectionsegment) -> 并调整段偏移和段长度 -> 合并符号表 -> 进行符号解析 -> 分配内存地址;

    b.由于编译过程中不会给符号分配地址,所以链接阶段要进行符号重定位(数据符号替换成真正的地址,函数符号替换成与下一行指令地址的偏移量);

/images/compile/compile_process.png
编译流程