如何解码这个重定位的调用?

How to decode this relocated call?

我正在尝试通过研究一些共享对象中的指令来学习一两件关于汇编语言的事情。我遇到过一种结构,其中 call 指令在其开始后导致 1 个字节,例如(来自 hte 的输出):

af6fc | e8fcffffff   call af6fdh

很明显,目标地址必须替换为适当的函数(我知道在这种情况下是 strcmp)。我觉得这很奇怪,因为在 same 共享对象的其他部分,使用 .got 调用 same strcmp 函数/ .plt 机制消除了重写 .text 部分的需要。在后一种情况下,可以通过研究 .rel.plt table 和 .dynsym 来识别目标函数。但是我如何找到前者的直接地址被重定向到哪里呢?我在任何部分都找不到任何地址 af6fcaf6fd,至少在 hte.

可访问的部分中找不到

你没有说你在哪个平台上。它似乎是 ix86

ix86 上,可以将 link 非 -fPIC 编译代码放入共享库(这会产生一个带有文本重定位的库,这是次优的)。

如果使用 objdump -R foo.so 转储动态重定位,您应该会看到针对地址 0xaf6fd 的重定位。动态 linker 将更新 0xaf6fd 处的 4 个字节,以指向加载 foo.so.

后重定位告诉它的任何位置

in other parts of the same shared object the same strcmp function is called using the .got / .plt mechanism

这些调用来自使用 -fPIC(正确)编译的对象。