Objcopy,它如何进行二进制输出?

Posted

技术标签:

【中文标题】Objcopy,它如何进行二进制输出?【英文标题】:Objcopy, how it makes binary output? 【发布时间】:2012-07-23 20:13:17 【问题描述】:

由于我是 binutils、gcc 和其他人的新手,所以我有一些一般性的问题,以及我在手册中找不到的答案。

我正在使用 C 和程序集(nasm 语法),我需要输出原始二进制文件。首先,我将我的代码编译为带有参数的 objec 文件:

cc -nostartfiles -nostdlib -c -ffreestanding <input file(s)> ;cc or gcc no matter

然后我使用简单的脚本链接所有文件,该脚本只将片段按需要的顺序排列。

ld -T <script> -o <o.file> <in.file(s)>  ;nothing special here

为了获得原始二进制文件,我使用 objcopy

objcopy -O binary <o.file> <in.file> ;can't be simplier

总而言之,我需要二进制文件only,其中包含 .text 和 .data 段以及 32 位代码。

1. 这样我能得到我想要的吗?

2.还有其他方法吗? (无论更简单或更复杂)


感谢您的帮助。


我编译 Asm 代码没有问题,几乎所有 C 代码都有问题。

【问题讨论】:

【参考方案1】:

当我遇到ld 手册页和/DISCARD/ 块时,据说会从最终输出中排除其中列出的所有内容。

所以我在.text.data.bss 块之后插入了这个块

/DISCARD/ : 

    *(.comment)
    *(.eh_frame)
    *(.note.GNU-stack)

以及我的链接器脚本开头的这一行。

OUTPUT_FORMAT("binary")

因此,我不再需要使用objcopy

【讨论】:

【参考方案2】:

您需要使用此命令编译源文件

nasm -o bin <SOURCE FILES>

这将产生纯二进制输出。

【讨论】:

nasm 只是一个汇编程序,它对项目中的 C 源文件无能为力...

以上是关于Objcopy,它如何进行二进制输出?的主要内容,如果未能解决你的问题,请参考以下文章

objcopy 之后以二进制形式出现的额外数据......它来自哪里?

使用 objcopy 将文本文件添加到二进制文件,但 objcopy 抱怨架构

Objcopy --writable-text 不使精灵二进制文本部分可写?

是否可以重新定位二进制文​​件?

Automake:在二进制目标中嵌入文本文件

从 ELF 二进制文件中删除部分的脚本