重定位PC相对引用
r.offset = 0xf
r.symbol = sum
r.type = R_X86_64_PC32
r.addend = -4
假设
- ADDR(S) = ADDR(.text) = 0x4004d0
- ADDR(r.symbol) = ADDR(sum) = 0x4004e8
则得出引用的运行时地址 refaddr = ADDR(S) + r.offset = 0x4004d0+0xf = 0x4004df
更新该引用,使其指向运行时sum程序: *refptr = ADDR(s.symbol) + r.addend - refaddr = 0x4004e8 + (-4) -0x4004df = 0x5
内存区域
- .text:已编译的机器代码
- .data:已初始化的全局和静态c变量
- .bss:未初始化的全局和静态c变量,以及所有初始化为0的全局和静态c变量
- 注意:局部c变量保存在栈中,不出现在data以及bss中
- common:未初始化的全局变量
- .symtab:一个符号表,存放在程序定义和引用的函数和全局变量信息
- 存储三种不同的符号(不存放非静态局部变量)
- 由模块m定义并能被其他模块引用的全局符号。 就是 非静态的c函数和全局变量
- 由其他模块定义被m引用的全局符号。 就是 其他模块的c函数和全局变量
- 只被m定义和引用的局部符号:static属性的c函数和全局变量
- static属性声明的全局变量或者函数都是模块私有的。
- 存储三种不同的符号(不存放非静态局部变量)