【问题标题】:Intel binary to ELF英特尔二进制到 ELF
【发布时间】:2013-04-03 06:38:21
【问题描述】:

这里非常快速的问题。我在 Ubuntu 中工作,我有一个简单的“Hello World!”我已经组装成 x86 程序集的程序集。现在我想将该机器代码转换为我的计算机可以运行的 ELF 可执行文件。我知道我可以直接汇编到 ELF,我的调查目的是发现如何从汇编的机器代码中生成 ELF 二进制文件。

谢谢!

【问题讨论】:

    标签: linux x86 executable elf


    【解决方案1】:

    最终的 ELF 可执行文件通常由其他 ELF 文件构建而成,并由链接器重新组织。当然,最简单的方法是将 ELF 指定为汇编器的输出格式。


    1) 如果你真的想这样做,你可以从一个“空”的 ELF 文件开始(你从编译或汇编什么都没有得到,等等)。然后您可以使用objcopy --add-section,它允许您将任意文件添加为现有 ELF 文件中的一个部分。

    这将创建一个最小的 ELF 文件:

    $ echo "" | gcc -c -o empty.out -xc -
    


    2) 或者,您可以使用 nasm 的 incbin 之类的东西将原始二进制文件包含到另一个程序集文件中,然后需要将其组装为 ELF。


    3)第三种选择(迄今为止最好的)是将原始二进制文件提供给链接器,并使用自定义链接器脚本告诉它将其放入哪个部分(根据输入文件名确定)。输入文件之前的-b 标志将告诉ld 它是什么类型的文件。这应该可以让你使用你的平面二进制文件。


    您将面临的首要障碍之一是让入口点指向您的代码。我不知道如何编辑它。

    有一个 Python 库 pyelftools 可以帮助您完成任务。

    【讨论】:

    • 如果我有兴趣修补自己的编译器,但还没有准备好花时间编写代码来生成包含所有标题、表和节的整个 ELF 文件,我可能有兴趣用 x86 机器代码制作 ELF 文件 :) 让我试试你的第一个建议......
    • @BigEndian 够公平的——这似乎是这样做的合乎逻辑的理由。如果我有其他想法,我会告诉你的。
    • 现在我的链接器对我来说已经很时髦了,差不多该睡觉了。我想我明天会把这个捡起来。我可能可以用一点 Python 代码来编辑入口点指针。 Kludgey 解决方案,但这是我擅长的。
    • 我想不出除了每次都手动输入并在十六进制编辑器中编辑文件之外的任何事情。我已经打印了一个简单的 ELF,并标出了所有不同的部分。这并非不可能,但这是一个严重的痛苦。 2对我来说并不是一个真正有吸引力的解决方案,这有点愚蠢。 3 不行,我试了试了试了。我对 1 持怀疑态度,但它可能有潜力。我还没有尝试过。
    【解决方案2】:

    如果它真的被组装了,那么它已经是 ELF 格式了(针对 Linux 的编译器通常也将目标代码存储在 ELF 目标文件中)。

    但是,如果您想要一个功能齐全的可执行文件,则必须将目标文件提供给 linker

    【讨论】:

    • @BigEndian 你这是什么意思?它是什么格式的?扁平二进制?你是如何调用汇编器的?
    • @JonathonReinhart 谢谢。还不完全清楚,但我想我们有一个扁平的二进制文件。好的,正在调查中。
    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多