C 如何从对象文件生成纯二进制文件?

C 如何从对象文件生成纯二进制文件?,c,gcc,binaryfiles,ld,C,Gcc,Binaryfiles,Ld,如何从两个对象(.o)文件生成原始二进制文件 我想要编译.asm文件时由nasm-f bin生成的纯二进制格式,但对于.o文件除外 所谓纯二进制文件,我指的是只包含指令的文件,而不是一些额外的信息,因为许多可执行文件包含许多额外的有用信息 有关这方面的信息,请参阅 PS:我想制作一个“普通二进制文件”作为开始。这会唤起记忆。我相信有更好的方法可以使用链接器脚本实现这一点,但这就是我年轻和愚蠢时的做法: # compile some files gcc -c -nostdlib -nostartf

如何从两个对象(.o)文件生成原始二进制文件

我想要编译.asm文件时由
nasm-f bin
生成的纯二进制格式,但对于.o文件除外

所谓纯二进制文件,我指的是只包含指令的文件,而不是一些额外的信息,因为许多可执行文件包含许多额外的有用信息

有关这方面的信息,请参阅


PS:我想制作一个“普通二进制文件”作为开始。

这会唤起记忆。我相信有更好的方法可以使用链接器脚本实现这一点,但这就是我年轻和愚蠢时的做法:

# compile some files
gcc -c -nostdlib -nostartfiles -nodefaultlibs -fno-builtin kernel.c -o kernel.o
gcc -c -nostdlib -nostartfiles -nodefaultlibs -fno-builtin io.c -o io.o

# link files and place code at known address so we can jump there from asm
ld -Ttext 0x100000 kernel.o io.o -o kernel.out

# get a flat binary
objcopy -S -O binary kernel.out kernel.bin
文件
kernel.c

__asm__("call _kmain");
__asm__("ret");

void kmain(void) { ... }
有趣的部分是在汇编程序中编写加载程序。

ld--oformat binary
是一个更直接的选项:

ld --oformat binary -o main.img -Ttext 0x7C00 main.o
这种方法的缺点是,我认为不可能重复使用符号进行调试,因为我们希望类似于:

qemu-system-i386 -hda main.img -S -s &
gdb main.elf -ex 'target remote localhost:1234'
因此,在这种情况下,您应该坚持使用
objcopy
。另见:

还要确保使用自己的干净链接器脚本:

存储库,包括一些常见案例的工作示例:


类似的问题:

您是在描述链接过程还是其他什么?所有文件都是原始二进制文件。你到底想用.o做什么?(我想知道是谁在投票支持这个)“没有可执行文件中包含的细节的普通二进制文件”仍然没有意义。我猜他想要一个机器可读的代码,运行裸机(没有操作系统)@Vitor这就是我想要的!