这里真的很快速的问题。我在 Ubuntu 中工作,我有一个简单的“Hello World!” 我已经组装成 x86 程序集的程序集。现在我想将该机器代码转换为我的计算机可以运行的 ELF 可执行文件。我知道我可以直接汇编到 ELF,我的调查目的是发现如何用汇编的机器代码制作 ELF 二进制文件。
谢谢!
这里真的很快速的问题。我在 Ubuntu 中工作,我有一个简单的“Hello World!” 我已经组装成 x86 程序集的程序集。现在我想将该机器代码转换为我的计算机可以运行的 ELF 可执行文件。我知道我可以直接汇编到 ELF,我的调查目的是发现如何用汇编的机器代码制作 ELF 二进制文件。
谢谢!
最终的 ELF 可执行文件通常由其他 ELF 文件构建而成,并由链接器重新组织。当然,最简单的方法是将 ELF 指定为汇编器的输出格式。
1)如果你真的想这样做,你可以从一个“空”的 ELF 文件开始(你从编译或组装什么都没有得到,等等)。然后您可以使用objcopy --add-section
,它允许您将任意文件添加为现有 ELF 文件中的一个部分。
这将创建一个最小的 ELF 文件:
$ echo "" | gcc -c -o empty.out -xc -
2) 或者,您可以使用类似 nasm's 的东西将原始二进制文件包含到另一个程序集文件中incbin
,然后需要将其组装为 ELF。
3)第三种选择(迄今为止最好的)是将原始二进制文件提供给链接器,并使用自定义链接器脚本告诉它将其放入哪个部分(由输入文件名确定)。-b
输入文件之前的标志将告诉它ld
是什么类型的文件。这应该让您使用您的平面二进制文件。
您将面临的首要障碍之一是让入口点指向您的代码。我不知道如何编辑它。
有一个 Python 库,pyelftools
可以帮助您完成任务。
如果它真的是汇编的,那么它已经是 ELF 格式(针对 Linux 的编译器通常也将目标代码存储在 ELF 目标文件中)。
但是,如果您想要一个功能齐全的可执行文件,则必须将目标文件提供给链接器。