5

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

$ objcopy -O binary myfile.elf myfile.bin

很遗憾:

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

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

有什么办法可以保留文件的可执行性?

4

1 回答 1

13

要被execve(2)系统调用执行,文件通常必须是一些elf(5)文件(或一些脚本,或一些旧a.out格式)。但另见binfmt_misc

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

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

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

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

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

我不明白你为什么期望objcopy -O binaryLinux 使用execve(2). 该objcopy -O binary命令的主要目的是制作固件或类似内核的独立(或独立)二进制文件,然后您需要准确了解它们的外观(例如,它们的起点是什么,它们是如何加载和启动的)而且您可能还使用了一些非常特定的链接器脚本,当然该二进制文件不能包含对linux 内核的任何系统调用(特别是不能像普通的 Linux 可执行文件那样进行任何类型的输入或输出)。

还可以阅读更多关于ABIx86-64 ABILinux Assembly HowToAdvanced Linux Programming一书的信息。

您可能应该阅读一本好的操作系统教科书,例如操作系统:三个简单的部分

于 2013-11-13T06:07:17.543 回答