使用GNU objcopy从Elf制作可执行的二进制文件

我想复制一个可执行的ELF文件通过:

$ objcopy -O binary myfile.elf myfile.bin 

不幸:

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

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

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

为了能够被execve(2)系统调用执行,文件通常必须是一些elf(5)文件(或者一些脚本,或者一些旧的a.out格式)。 但是也请参阅binfmt_misc

您的objcopy(1)命令将丢失ELF文件中的基本元数据。 也许你想脱衣服(1)

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

当你使用objcopy -O二进制 ,你只复制二进制数据:

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

特别是你失去了原始ELF头文件中给出的入口点和段列表。 内核不能猜测它们。

我不明白你为什么期望objcopy -O binary的结果可以由Linux使用execve(2)来执行。 objcopy -O binary命令的主要目的是制作固件或类似内核的独立(或独立)二进制文件,然后你需要准确理解它们应该是什么样的(例如,它们的起点是什么,它们是怎样的加载和启动),你可能也使用一些非常具体的链接器脚本 ,当然,二进制文件不能包含Linux内核的任何系统调用 (特别是不能做任何类型的输入或输出的方式,一个普通的Linux可执行文件)。

请阅读更多关于ABIs , x86-64 ABI , Linux Assembly HowTo , 高级Linux编程的书。

你可能应该阅读一个很好的操作系统教材:三个简单的部分 。