使用GNU objcopy从Elf创建可执行二进制文件

时间:2013-11-13 03:02:50

标签: linux file executable gnu objcopy

我想通过以下方式复制可执行的ELF文件:

$ objcopy -O binary myfile.elf myfile.bin

不幸的是:

$ chmod +x myfile.bin
$ ./myfile.bin

导致:无法执行二进制文件

有没有办法保留文件的可执行性?

1 个答案:

答案 0 :(得分:11)

要由execve(2)系统调用执行,文件通常必须是某个elf(5)文件(或某些脚本,或某些旧的a.out格式)。但另请参阅binfmt_misc

您的objcopy(1)命令正在丢失ELF文件中的基本元数据。也许你想要strip(1)

回想一下,ELF是一个非常复杂和通用的格式,它指定了起始地址,解释器(ld-linux(8)动态链接器),程序的几个部分等。所有这些元数据都是内核需要execve(2)并且objcopy -O binary ...

丢失了

使用objcopy -O binary时,只复制二进制数据:

  

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

特别是你丢失了原始ELF标题中给出的入口点和段列表。内核无法猜测它们。

我不明白为什么你希望objcopy -O binary的结果可以由Linux使用execve(2)执行。 objcopy -O binary命令的主要目的是制作firmware或类似内核的独立(或独立)二进制文件,然后你需要准确理解它们应该是什么样的(例如它们的起点是什么)点,它们是如何加载和启动的)你可能还使用了一些非常具体的linker script,当然二进制文件不能包含任何syscall linux kernel(特别是不能做任何类型的ABIs按照普通Linux可执行文件的方式输入或输出。)

还详细了解x86-64 ABILinux Assembly HowToAdvanced Linux ProgrammingOperating System: Three Easy Pieces本书。

你可能应该阅读一本好的操作系统教科书,如{{3}}。