是否可以重新定位二进制文​​件?

Posted

技术标签:

【中文标题】是否可以重新定位二进制文​​件?【英文标题】:Is it possible to relocate a binary? 【发布时间】:2017-02-19 09:32:28 【问题描述】:

我使用 objcopy -o binary 创建了一个从 elf 文件创建的原始二进制文件。是否可以通过给定的偏移量重新定位它?我相信我正在寻找的效果类似于使用 --change-addresses 选项然后将其转换为二进制。

提前谢谢你

【问题讨论】:

【参考方案1】:

来自man obdjdump

objcopy 可用于通过使用 binary 的输出目标(例如,使用 -O binary)来生成原始二进制文件。当 objcopy 生成原始二进制文件时,它本质上会 生成输入目标文件内容的内存转储。 所有符号和重定位信息都将被丢弃。内存转储将从复制到输出文件的最低部分的加载地址开始。

(我强调)

因此,除非您要导出在不同位置加载的多个部分,否则将您推送到二进制文件中的单个部分移动没有任何效果。

【讨论】:

我不知道我是否明白你的意思。该代码旨在在嵌入式环境中,在真实的物理地址空间中运行。所以实际上移动单个部分很重要。二进制文件必须准备好在将要加载的特定位置运行。 但这不是-O binary 产生的那种二进制文件; “内存转储将从最低部分的加载地址开始”。所以如果你只有一个部分,那么无论它从哪里开始,它的开始总是二进制转储的开始。 是的,当然。但在链接描述文件中,实际的 VMA 地址被指定为感兴趣的地址范围。例如,如果一个全局变量位于地址 X,代码将引用该地址。我想更改二进制文件,以便更改引用变量的代码(现在将位于 X+OFFSET)以引用正确的地址。 嗯,我明白了,但是您是如何从二进制文件中获得“这是 X,将其移至此处”的信息?二进制文件丢失了有关链接器部分的所有信息。 这正是我的问题。我不明白怎么能做到这一点。但是,鉴于我对该主题的内在知识有限,我想问是否可以通过非常规的方法或工具来实现。

以上是关于是否可以重新定位二进制文​​件?的主要内容,如果未能解决你的问题,请参考以下文章

gcc:在 32 位平台上编译 64 位二进制文​​件

为啥 32 位内核可以运行 64 位二进制文​​件?

Python:读取 12 位二进制文​​件

如何使用 npm 在 64 位系统上构建 32 位二进制文​​件?

Objcopy 获取目标文件 64 位二进制文​​件

无法在 64 位 Debian 上运行 32 位二进制文​​件