【发布时间】:2013-04-03 06:38:21
【问题描述】:
这里非常快速的问题。我在 Ubuntu 中工作,我有一个简单的“Hello World!”我已经组装成 x86 程序集的程序集。现在我想将该机器代码转换为我的计算机可以运行的 ELF 可执行文件。我知道我可以直接汇编到 ELF,我的调查目的是发现如何从汇编的机器代码中生成 ELF 二进制文件。
谢谢!
【问题讨论】:
标签: linux x86 executable elf
这里非常快速的问题。我在 Ubuntu 中工作,我有一个简单的“Hello World!”我已经组装成 x86 程序集的程序集。现在我想将该机器代码转换为我的计算机可以运行的 ELF 可执行文件。我知道我可以直接汇编到 ELF,我的调查目的是发现如何从汇编的机器代码中生成 ELF 二进制文件。
谢谢!
【问题讨论】:
标签: linux x86 executable elf
最终的 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 格式了(针对 Linux 的编译器通常也将目标代码存储在 ELF 目标文件中)。
但是,如果您想要一个功能齐全的可执行文件,则必须将目标文件提供给 linker。
【讨论】: