我想通过以下方式复制一个可执行的 ELF 文件:
$ objcopy -O binary myfile.elf myfile.bin
很遗憾:
$ chmod +x myfile.bin
$ ./myfile.bin
结果:无法执行二进制文件
有什么办法可以保留文件的可执行性?
我想通过以下方式复制一个可执行的 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 binary时,您只复制二进制数据:
objcopy 可用于通过使用'binary' 的输出目标(例如,使用-O binary)来生成原始二进制文件。当 objcopy 生成原始二进制文件时,它本质上会生成输入对象文件内容的内存转储。所有符号和重定位信息都将被丢弃。内存转储将从复制到输出文件的最低部分的加载地址开始。
特别是您丢失了原始 ELF 标头中给出的入口点和段列表。内核无法猜测它们。
我不明白你为什么期望objcopy -O binary
Linux 使用execve(2)
. 该objcopy -O binary
命令的主要目的是制作固件或类似内核的独立(或独立)二进制文件,然后您需要准确了解它们的外观(例如,它们的起点是什么,它们是如何加载和启动的)而且您可能还使用了一些非常特定的链接器脚本,当然该二进制文件不能包含对linux 内核的任何系统调用(特别是不能像普通的 Linux 可执行文件那样进行任何类型的输入或输出)。
还可以阅读更多关于ABI、x86-64 ABI、Linux Assembly HowTo、Advanced Linux Programming一书的信息。
您可能应该阅读一本好的操作系统教科书,例如操作系统:三个简单的部分。