- 链接器符号:用于符号解析时使用,全局符号(书上讲的全局符号,常指的是静态符号,比如初始化全局变量区。),本地符号。(除了堆,库的变量之外的符号,都是静态的,主要两类:函数符号FUNC,数据符号OBJ)
- 符号定义:指的是静态符号的定义,静态变量和函数(函数一定是静态的,所以static修饰的函数符号,反而变成局部的意思)
- 静态:在未执行的可执行文件中占空间,静态变量或者函数。
- 头文件:头文件是为了方便其他模块方便引用外部符号,其他模块也可以手工书写,但是麻烦。所以程序员遵循这样的一种规则,将需要public的变量,函数原型,放入头文件,供其他目标模块include,事实上,其他模块即使不include,通过声明,也可以访问该模块定义的供其他模块访问的符号。所以为了安全,所有供外部访问的符号要放入头文件。
- 找到定义叫解析。
- 声明:帮助编译器编译出正确的指令。 定义:对符号定义具体内容。 引用:对于定义出的符号进行引用。
- 在目标重定位文件中,链接时,声明定义(的全局符号)用来产生符号表。
- 声明不会被编译成指令,而引用和定义会。
- 重定位节和符号定义: 符号定义,使符号在程序中位置。
- 连接器生成可执行文件分3步:1.符号解析。 2.节和符号重定位。 3.重定位节中(节中,即静态的)的符号引用。
- 符号解析:好像就是检查符号引用和符号定义是有对应,是否重复定义等问题。可能会更新新的符号表(已去除重复定义的符号),使引用的重定位计算不会出错(如对应错符号表)。
- 节和符号重定位:即将所有重定位目标文件,相同的节聚合,并生成新节和所定义符号的新地址(可能是新的符号表,节地址被替换为新的节绝对地址)。
- 重定位节中的符号引用:利用重定位条目表和 (这可能就是新的符号表)新的节地址,符号地址替换引用的值(值是地址)。
- PS:重定位条目表示汇编器生成的。包含:引用在节中偏移,符号——这就是引用符号相联系,重定位类型。