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

Compilation Objcopy,它是如何进行二进制输出的?,compilation,binaryfiles,binutils,objcopy,Compilation,Binaryfiles,Binutils,Objcopy,由于我不熟悉比努蒂尔斯、gcc和其他人,我有一些一般性的问题,这些问题在手册中找不到 我使用的是C和汇编(nasm语法),输出时需要原始二进制文件。首先,我用参数将代码编译成objec文件: cc -nostartfiles -nostdlib -c -ffreestanding <input file(s)> ;cc or gcc no matter cc-nostartfiles-nostlib-c-ffreservation;不管是cc还是gcc 然后,我使用简单的脚本链接

由于我不熟悉比努蒂尔斯、gcc和其他人,我有一些一般性的问题,这些问题在手册中找不到

我使用的是C和汇编(nasm语法),输出时需要原始二进制文件。首先,我用参数将代码编译成objec文件:

cc -nostartfiles -nostdlib -c -ffreestanding <input file(s)> ;cc or gcc no matter
cc-nostartfiles-nostlib-c-ffreservation;不管是cc还是gcc
然后,我使用简单的脚本链接所有文件,该脚本只按需要的顺序放置片段

ld -T <script> -o <o.file> <in.file(s)>  ;nothing special here
ld-T-o;这里没什么特别的
为了得到原始二进制文件,我使用objcopy

objcopy -O binary <o.file> <in.file> ;can't be simplier
objcopy-O二进制文件;再简单不过了
总而言之,我只需要包含.text和.data段以及32位代码的二进制文件

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

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


谢谢你的帮助



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

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

nasm -o bin <SOURCE FILES>
nasm-o-bin

这将产生纯二进制输出。

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

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

/DISCARD/ : 
{
    *(.comment)
    *(.eh_frame)
    *(.note.GNU-stack)
}
以及我的链接器脚本开头的这一行

OUTPUT_FORMAT("binary")

因此,我不再需要使用
objcopy

nasm只是一个汇编程序,它无法处理项目中的C源文件。。。