我应该如何从两个对象(.o)文件生成原始二进制文件?
我想要编译.asm文件时由nasm -f bin
生成的纯二进制格式,但是对于.o文件。
通过普通的二进制文件,我的意思是一个只包含指令的文件,而不是一些额外的信息,因为许多可执行文件包含许多额外的有用信息。
有关相关信息,请参阅http://www.nasm.us/doc/nasmdoc7.html。
PS:我想制作一个"普通的二进制文件"从QEMU开始。
答案 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?