<深入理解计算机系统>第七章读书笔记
<深入理解计算机系统>第七章读书笔记
链接
链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程。(这个文件可被加载或拷贝到存储器并执行)
链接可以执行于编译,加载或运行时。
静态链接:
两个主要任务:
1 符号解析:将目标文件中的每个全局符号都绑定到一个唯一的定义
2 重定位:确定每个符号的最终存储器地址,并修改对那些目标的引用
符号表:
typedef struct{ int name; //字符串表中的字节偏移,指向符号的以NULL结尾的名字
int value; //符号的地址,对于可重定位的模块是距定义目标的节起始位置的偏移。
int size; //目标大小(单位:字节)
char type:4, //数据或函数
binding:4; //本地LOCAL/全局GLOBAL
char reserved;
char section; //到节头部表的索引
}Elf_Symbol;
每个符号都和目标的某个节相关联,由section字段表示。
section字段三个特殊的伪节
ABS:不该被重定位的符号。
UNDEF:未定义的符号,在本目标模块中引用,但在其他地方定义。
COMMON:未被分配位置的未初始化数据目标。
Ndx=1表示.test节,Ndx=3表示.data节。
目标文件三种形式:
1可重定位目标文件
2可执行目标文件
3共享目标文件
共享目标文件(共享库)是在运行时由动态链接器链接和加载,或者隐含地在调用程序被加载和开始执行时,或者根据需要在程序调用dlopen库的函数。
加载器将可执行文件的内容映射到存储器,然后调用动态链接器,通过加载共享库和重定位程序中的引用来完成链接任务。
Fpic
被编译为位置无关代码的共享库可以加载到任何地方,也可以在运行时被多个进程共享
编译库代码,使得不需要链接器修改库代码就可以在任何地址加载和执行这些代码。
用户对GCC使用-fPIC选项指示GNU生成PIC代码
处理目标文件的工具
AR:创建静态库,插入、删除、列出和提取成员。
STRINGS:列出一个目标文件中所有可打印的字符串。
STRIP:从目标文件中删除符号的信息。
NM:列出一个目标文件的符号表中定义的符号。
SIZE:目标文件中节的名字和大小。
READELF:显示一个目标文件的完整结构,包括ELF头中的编码的所有信息。包含SIZE和NM的功能。
OBJDUMP:所有二进制工具之母,能够显示一个目标文件中所有的信息。它最大的作用是反汇编.text节中的二进制指令。
LDD:列出一个可执行文件在运行时所需要的共享库。