【问题标题】:Make Executable Binary File From Elf Using GNU objcopy使用 GNU objcopy 从 Elf 制作可执行二进制文件
【发布时间】:2013-11-25 12:04:17
【问题描述】:

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

$ objcopy -O binary myfile.elf myfile.bin

不幸的是:

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

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

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

【问题讨论】:

  • 为什么要问,这样做的目的是什么?
  • 我试图回答,但你的问题似乎没有任何意义,让我相信你不了解一些基本概念(比如内核的作用,什么是系统调用,什么是操作系统等...)

标签: linux file executable gnu objcopy


【解决方案1】:

要被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 标头中给出的入口点和段列表。内核无法猜测它们。

我不明白你为什么期望objcopy -O binary 的结果可以被Linux 使用execve(2) 执行。 objcopy -O binary 命令的主要目的是制作firmware 或类似内核的独立(或独立)二进制文件,然后您需要准确了解它们应该是什么样子(例如,它们的起点是什么,它们如何已加载并启动)并且您可能还使用了一些非常具体的linker script,当然该二进制文件不能包含任何syscalllinux kernel(特别是不能像普通Linux可执行文件那样进行任何类型的输入或输出做他们)。

阅读更多关于ABIsx86-64 ABILinux Assembly HowToAdvanced Linux Programming 的书籍。

您可能应该阅读一本好的操作系统教科书,例如 Operating System: Three Easy Pieces

【讨论】:

  • x86-64 ABI 的链接已损坏。
猜你喜欢
  • 2011-09-27
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多