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

5

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

$ objcopy -O binary myfile.elf myfile.bin

很遗憾:

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

结果是:无法执行二进制文件

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


你为什么问这个问题,做这件事的目的是什么? - Basile Starynkevitch
2
我试图回答,但你的问题似乎毫无意义,让我相信你不理解一些基本概念(例如内核的作用、系统调用、操作系统等)。 - Basile Starynkevitch
1个回答

14
要使用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 头中给出的入口点和段列表。内核无法猜测它们。
我不明白为什么你期望使用execve(2)在Linux上使objcopy -O binary的结果可执行。该objcopy -O binary命令的主要目的是制作类似firmware或内核的独立(或自由站立)二进制文件,然后您需要确切地了解它们应该看起来像什么(例如,它们的起始点,如何加载和启动),还可能使用一些非常特定的linker script,当然该二进制文件不能包含任何syscalllinux kernel(特别是不能以纯Linux可执行文件的方式进行任何类型的输入或输出)。

阅读关于ABIs, x86-64 ABI, Linux Assembly HowTo, Advanced Linux Programming书的更多信息。

你可能需要阅读一本好的操作系统教材,比如Operating System: Three Easy Pieces


1
x86-64 ABI的链接已损坏。 - David Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接