如何从目标文件生成纯二进制文件?

时间:2014-08-22 08:00:02

标签: c gcc binaryfiles ld

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

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

通过普通的二进制文件,我的意思是一个只包含指令的文件,而不是一些额外的信息,因为许多可执行文件包含许多额外的有用信息。

有关相关信息,请参阅http://www.nasm.us/doc/nasmdoc7.html

PS:我想制作一个"普通的二进制文件"从QEMU开始。

2 个答案:

答案 0 :(得分:6)

这带回了回忆。我确信使用链接器脚本有更好的方法来实现这一点,但这就是我在年轻和愚蠢的时候做到的:

# 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) { ... }

有趣的部分是在汇编程序中编写加载程序。

答案 1 :(得分:1)

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。另见:https://stackoverflow.com/a/32960272/895245

还要确保使用自己的干净链接描述文件:https://stackoverflow.com/a/32594933/895245

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

类似的问题:How to generate plain binaries like nasm -f bin with the GNU GAS assembler?