链接:是将各种代码和数据片段收集并组合成一个单一文件的过程,这个文件可以被加载到内存并执行。链接可以执行于编译时,加载时或是运行时。
静态链接:静态链接是像Linux LD程序这样的静态链接器以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的、可以加载和运行的可执行目标文件作为输出。
目标文件三种形式:
- 可重定位目标文件:包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。
- 可执行目标文件:包含二进制代码和数据,其形式可以直接拷贝到存储器并执行。
- 共享目标文件:一种特殊类型的可重定位目标文件,可以在加载或运行时被动态地加载到存储器并链接。
典型的ELF 可重定位目标文件包含以下几个节:
.text:已编译程序的机器代码
.rodata:制度数据,比如 printf 语句中的格式串和开关语句的跳转表
.data:已初始化的全局 C 变量。
.bss:未初始化的全局 C 变量。
.symtab:一个符号表,它存放在程序中定义和引用的函数和全局变量的信息。
.rel.text:一个 .text 节中位置的列表,当链接器把这个目标文件和其它文件结合时,需要修改这些设置。
.rel.data:被模块引用或定义的任何全局变量的重定位信息。
.debug:一个调试符号表,其条目是程序中定义的局部变量和类型定义。
.line:原始 C 源程序中的行号和 .text 节中机器指令之间的映射。
.strtab:一个字符串表,其内容包括 .symtab 和 .debug 节中的符号表,以及节头部中的节名字。