是否可以重新定位二进制文件?
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,将其移至此处”的信息?二进制文件丢失了有关链接器部分的所有信息。
这正是我的问题。我不明白怎么能做到这一点。但是,鉴于我对该主题的内在知识有限,我想问是否可以通过非常规的方法或工具来实现。以上是关于是否可以重新定位二进制文件?的主要内容,如果未能解决你的问题,请参考以下文章