静态链接
详见程序员的自我修养P107
这里我重点手说下符号表和重定位表是怎么联系起来的
重定位表中有若干项重定位入口,每一个重定位入口其实就是一个数据结构
typedef struct{ Elf32_Addr r_offset; Elf32_Word r_info; }
重定位入口的偏移表示该入口在要被重定位的段中的位移(比如说在代码段的偏移值),被重定位的段可以是代码段数据段等
或者说是该重定位入口所要修正的位置的第一个字节相对于段的偏移
r_info 重定位的入口的类型和符号。这个成员的低八位表示重定位入口的类型,高24位表示重定位入口的符号在符号表中的下标
这里又提到符号表,什么是符号表呢?其实它是一个结构体数组
那么来看下这个数据结构P82
它包括6个成员,这里只介绍重要的几个
st_value 符号对应的值,如果符号是一个函数或者变量的定义,该值就是该函数或者变量的地址,更准确的应该分情况对待见P83
st_shndx 符号所在的段
所以重定位一个符号的步骤:
在重定位表中查找重定位项,该符号所在的段,在利用偏移锁定该符号的具体位置,根据符号表中的值重定位该符号