CSAPP - Chapter7 链接
7.2 静态链接 为了构造可执行文件,链接器必须完成两个主要任务: 符号解析。将每个符号引用和一个符号定义连接起来。 重定位。编译器和汇编器生成从 0 地址开始的代码和数据节。连接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节。然后修改所有对这些符号的引用,使得他们指向这个内存位置。 7.3 目标文件 可重定位目标文件 .o, .a(.a 就是一堆打包的.o) 可执行目标文件 elf 共享目标文件 .so 7.4 可重定位目标文件 .text 代码段 .rodata 只读数据段,保存字符串,const 数据等。 .data 数据段。全局和静态变量。 .bss 未初始化和初始化为 0 的全局和静态变量。不占空间。 .symtab 符号表,存放程序中定义和引用的函数和全局变量信息。 .rel.text .text 节中需要重定位的代码段。 .rel.data .data 节中需要重定位的数据段,被模块引用或定义的所有全局变量。 .debug 调试符号表。包含程序中定义的局部变量和类型定义,定义和引用的全局变量,原始的 C 源文件。 .line 原始 C 文件中的行号和.text 节中机器指令的映射。 .strtab 字符串表。 7.5 符号和符号表 由当前模块定义并能被其他模块引用的全局符号 其他模块定义并被当前模块引用的全局符号,称为外部符号 只被当前模块定义和引用的的局部符号 下面两个局部静态变量: int f() { static int x = 1; return x; } int g() { static int x = 2; return x; } 两个 x 分别在各自的函数中可见,这两个 x 都会保存到....