作者回复: 观察的很细致!这里确实是我把 ELF32 与 ELF64 下的重定位方式搞混了,因为比如对于 R_386_32 和 R_X86_64_64 来说,两个的计算方式都是 S + A,但前者中的 A 实际指的是被修改内存所在位置上的值,本质上就是符号的 addend。而对于后者,也就是 ELF64 来说,addend 被单独拎出来与重定向条目放到一起了。这里我来纠正一下,稍后我也会修改下文章内容!感谢! 这里我把 ELF 标准中的相关段落也放出来,大家在后面的学习中也注意类似的问题。文档(http://www.skyfree.org/linux/references/ELF_Format.pdf)第 29 页:“The SYSTEM V architecture uses only Elf32_Rel relocation entries, the field to be relocated holds the addend.”
作者回复: 回答的不错!
作者回复: 因为从左侧可以看到,这一行的起始字节位置是 “0x40053e”,而实际发生重定向的位置是在这里后面数三个字节的地方,所以需要再加 3,得到正确的地址 “0x400541”。
作者回复: 这里 P 实际上就是符号重定位想要去修改的那个符号,在文件中的偏移位置。