- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚使用 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/
我最近下载了 Eclipse Portable 以随时随地进行 Java 编程。我还下载了 Java Portable。 如何将 Java Portable 与 Eclipse Portable 集成
我想包括一个可移植的类库,如下图所示: 但是,我收到以下错误: no exports were found that match the constraint contractname microso
我无法理解 Visual Studio 2015 中所有这些不同类库模板之间的区别。谁能解释或提供文档?我试过寻找但没有成功。 最佳答案 Portable 无需安装即可运行和引用 类库是 Window
我有 .net 核心测试项目。当我在 visual studio 中构建它或使用 TestManager 时,它构建时没有问题。但是,当我在包管理器控制台上执行以下命令时,出现错误: dotnet 测
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
如何编写可移植的初始化脚本 Upstart (Ubuntu) 系统 可选的init.d 其他平台(Windows、Android、OS-X)在我的上下文中并不重要。 最佳答案 两者都是systemd和
如果有人在优化代码、实现的清晰度、效率和可移植性方面证明他们的设计权衡是合理的,该如何选择? 这个问题的一个相关示例可能是大文件处理,其中“大文件”是“相当几 GB”的问题,可以使用随机访问方法进行简
aarch64 上的用户程序是否可以检测 crc32 指令是否可用?我找到了 references to kernel support对于这种检测,意味着包含有关哪些指令将在用户模式下工作的信息的寄存
当我在 hexeditor 中查看 pe 文件时,值被反向存储在其中,但为什么? 例如: pe文件头结构中第2条记录是指Number Of Section 那是值(value)是 0300 但实际值为
我知道这个问题可能听起来很奇怪,因为 GLib 是一个可移植性库,但它的可移植性如何?举一个例子:GLib(包括GObject)是在微 Controller 上运行还是依赖于某种操作系统? 我可以在何
我想在OllyDbg中分析一个文件,但是该文件中的“入口点地址”是0x0000。因此它将运行 MZ 签名作为 ASM 代码的开始部分。 大多数调试器也无法直接调试它。 如何找到修改 header 的原
我想在OllyDbg中分析一个文件,但是该文件中的“入口点地址”是0x0000。因此它将运行 MZ 签名作为 ASM 代码的开始部分。 大多数调试器也无法直接调试它。 如何找到修改 header 的原
问题 如果我在 windows 上使用 clozure cl 在普通 lisp 中制作 2d 游戏(使用:lispbuilder-sdl、quicklisp、cffi),我以后能否轻松地将其移植到其他
谁能解释一下IMAGE_THUNK_DATA的结构? 我只知道它有4个元素,但我想要这些元素的解释。 最佳答案 IMAGE_THUNK_DATA 的定义如下: typedef struct _IMAG
我刚刚使用 objdump -x ... 来检查 PE 文件的部分。 大约有 90,000 行 reloc 条目: reloc 92 offset bc0 [524bc0] HIGHLOW re
我只是想使用它,这是个好东西,但我不确定它是否受到所有主要浏览器的支持。 最佳答案 I am not sure if it's supported by all major browsers. 是的。
我正在阅读 java persistence specification version 2.1 在第 25 页中有最后一段: 实体子类可以覆盖属性访问器方法。但是,可移植应用程序不得覆盖适用于持久字
我在一个解决方案中有两个项目。核心和机器人。在 Droid 项目中,我有一个方法需要在异步方法 IN CORE 完成其任务时调用。我在 Core 中的代码是: public async
我最近不得不从一位老同事那里接手一个项目;该项目是用 JAVA 编写的,使用 Java Web-Start 并使用轻型 Java 库 (org.apache.catalina.startup.Tomc
我有一个简单的 HTML 页面,它包含指向图片和其他 HTML 页面的链接。我把网页放在内存USB上。当我将内存 USB 插入另一台 PC 时,我需要更改其在文件中的路径。我怎么能自动做到这一点? 谢
我是一名优秀的程序员,十分优秀!