use*_*888 5 linux executable gnu file objcopy
我想通过以下方式复制可执行的ELF文件:
$ objcopy -O binary myfile.elf myfile.bin
Run Code Online (Sandbox Code Playgroud)
不幸:
$ chmod +x myfile.bin
$ ./myfile.bin
Run Code Online (Sandbox Code Playgroud)
结果:无法执行二进制文件
有没有办法保留文件的可执行性?
Bas*_*tch 11
要由execve(2)系统调用执行,文件通常必须是某个elf(5)文件(或某些脚本,或某些旧a.out格式).但另请参阅binfmt_misc
你的objcopy(1)命令正在丢失ELF文件中的基本元数据.也许你想要脱衣舞(1)
回想一下,ELF是一个相当复杂的和灵活的格式时,它指定的起始地址,该解释器(LD-Linux的(8)动态连接器),该程序等的若干段所有这些元数据是由内核需要execve(2)和迷失了objcopy -O binary......
当您使用objcopy -O二进制文件时,您只复制二进制数据:
objcopy可以用于通过使用`binary'的输出目标生成原始二进制文件(例如,使用-O binary).当objcopy生成原始二进制文件时,它实际上会产生输入对象文件内容的内存转储.所有符号和重定位信息都将被丢弃.内存转储将从复制到输出文件中的最低部分的加载地址开始.
特别是你丢失了原始ELF标题中给出的入口点和段列表.内核无法猜测它们.
我不明白你为什么期望objcopy -O binaryLinux使用可执行的结果execve(2).该objcopy -O binary命令的主要目的是制作固件或类似内核的独立(或独立)二进制文件,然后您需要准确理解它们的外观(例如,它们的起点是什么,它们是如何加载和启动的)并且您可能还使用了一些非常具体的链接器脚本,当然二进制文件不能包含任何到Linux内核的系统调用(特别是不能像普通的Linux可执行文件那样进行任何类型的输入或输出).
另请阅读有关ABI,x86-64 ABI,Linux Assembly HowTo,高级Linux编程书籍的更多信息.
您可能应该阅读一本好的操作系统教科书,如操作系统:三个简单的片断.