gpt4 book ai didi

linux - 使用 GNU objcopy 从 Elf 生成可执行二进制文件

转载 作者:IT王子 更新时间:2023-10-29 01:08:42 26 4
gpt4 key购买 nike

我想通过以下方式复制可执行的 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 文件中的基本元数据。也许你想要 strip(1)

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

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

objcopy can be used to generate a raw binary file by using an output target of `binary' (e.g., use -O binary). When objcopy generates a raw binary file, it will essentially produce a memory dump of the contents of the input object file. All symbols and relocation information will be discarded. The memory dump will start at the load address of the lowest section copied into the output file.

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

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

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

您可能应该阅读像 Operating System: Three Easy Pieces 这样的好操作系统教科书。

关于linux - 使用 GNU objcopy 从 Elf 生成可执行二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19944441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com