重定位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属性声明的全局变量或者函数都是模块私有的。image.png