如何解码这个重定位的调用?
How to decode this relocated call?
我正在尝试通过研究一些共享对象中的指令来学习一两件关于汇编语言的事情。我遇到过一种结构,其中 call
指令在其开始后导致 1 个字节,例如(来自 hte
的输出):
af6fc | e8fcffffff call af6fdh
很明显,目标地址必须替换为适当的函数(我知道在这种情况下是 strcmp
)。我觉得这很奇怪,因为在 same 共享对象的其他部分,使用 .got
调用 same strcmp
函数/ .plt
机制消除了重写 .text
部分的需要。在后一种情况下,可以通过研究 .rel.plt
table 和 .dynsym
来识别目标函数。但是我如何找到前者的直接地址被重定向到哪里呢?我在任何部分都找不到任何地址 af6fc
或 af6fd
,至少在 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
(正确)编译的对象。
我正在尝试通过研究一些共享对象中的指令来学习一两件关于汇编语言的事情。我遇到过一种结构,其中 call
指令在其开始后导致 1 个字节,例如(来自 hte
的输出):
af6fc | e8fcffffff call af6fdh
很明显,目标地址必须替换为适当的函数(我知道在这种情况下是 strcmp
)。我觉得这很奇怪,因为在 same 共享对象的其他部分,使用 .got
调用 same strcmp
函数/ .plt
机制消除了重写 .text
部分的需要。在后一种情况下,可以通过研究 .rel.plt
table 和 .dynsym
来识别目标函数。但是我如何找到前者的直接地址被重定向到哪里呢?我在任何部分都找不到任何地址 af6fc
或 af6fd
,至少在 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
(正确)编译的对象。