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

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

提前谢谢你

【问题讨论】:

    标签: binary relocation objcopy


    【解决方案1】:

    来自man obdjdump

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

    (我强调)

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

    【讨论】:

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