gpt4 book ai didi

portable-executable - 那么大部分的binary都是由reloc table组成的?

转载 作者:行者123 更新时间:2023-12-01 13:28:33 27 4
gpt4 key购买 nike

我刚刚使用 objdump -x ... 来检查 PE 文件的部分。

大约有 90,000 行 reloc 条目:

reloc   92 offset  bc0 [524bc0] HIGHLOW
reloc 93 offset bc4 [524bc4] HIGHLOW
....

大多数 PE 文件的大部分空间都是由上述 reloc 条目组成的吗?

这些条目有什么用?

更新

谁能解释一下重定位条目是如何像上面那样工作的?

最佳答案

当内存中存在基址冲突时,需要进行重定位。如果一个动态链接库要在某个内存空间加载它的代码段,但当它已经被另一个模块占用时,就必须在不同的地方加载它。但是,通过将它加载到不同的地址空间,它会弄乱库引用的所有绝对引用。例如,假设可执行文件有一个名为 int dummy; 的全局变量,该变量位于 0x602315。每当访问/写入此变量时,程序都会执行以下操作码(假设代码位于 0x524BBE,与您提到的条目相同):

0x524BBE: MOV EAX, DWORD PTR DS:[0x602315];//将虚拟对象移动到 eax 寄存器以执行操作

当库加载到不同的空间时,0x602315 将不会指向该变量,因为地址空间 0x602315 已被其他模块占用。因此,要解决此问题,您必须告诉 PE 加载程序将位移 (|new base address-expected base address|) 添加/减去此值 (0x602315)。为此,每个 PE 都包含一个名为重定位表的表,该表包含您的代码中引用该变量的所有偏移量。

所以,假设库加载到 0x700000 而不是 0x524000(预期的基本偏移量)。然后,PE 加载器将查找表中的条目并将位移 (0x700000-0x524000=0x1DC000) 添加到偏移量 (0x602315),这样您加载的代码将如下所示:

0x700BBE: MOV EAX, DWORD PTR DS:[0x7DE315];//将 dummy 移至 eax 寄存器以执行操作

它将运行良好,因为它指向变量 dummy 的正确位置。

回到您的问题,objdump 的输出显示了该表的每个条目。 92 可能表示条目的索引,BC0 是您访问变量的代码的相对地址,[524BC0] 将是相对地址 + 预期基址偏移的结果。而 HIGHLOW 只是一种重定位(这实际上是为将来使用保留的。目前,只有一种重定位(HIGHLOW)正在使用,因此您不必担心其他类型)。当加载程序读取此条目时,它将更改 0x524BC0 的值以反射(reflect)此更改。

关于你关于PE的多数空间由.reloc表组成的问题,答案是视情况而定。如果您的程序频繁访问全局变量和常量,它将有一个巨大的重定位表,因为加载器必须更新的地方太多了。

关于portable-executable - 那么大部分的binary都是由reloc table组成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6002359/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com