我应该如何从两个对象(.o)文件中生成原始二进制文件?
我想要由nasm -f bin
编译.asm文件时产生的纯二进制格式,但是用于.o文件。
所谓的纯二进制文件是指仅包含指令的文件,而不是一些额外信息,因为许多可执行文件包含了很多额外的有用信息。
请参见http://www.nasm.us/doc/nasmdoc7.html获取更多信息。
PS: 我想制作一个“纯二进制”文件,在QEMU中启动。
我应该如何从两个对象(.o)文件中生成原始二进制文件?
我想要由nasm -f bin
编译.asm文件时产生的纯二进制格式,但是用于.o文件。
所谓的纯二进制文件是指仅包含指令的文件,而不是一些额外信息,因为许多可执行文件包含了很多额外的有用信息。
请参见http://www.nasm.us/doc/nasmdoc7.html获取更多信息。
PS: 我想制作一个“纯二进制”文件,在QEMU中启动。
这让我想起了过去。我相信使用链接脚本可能会有更好的方法,但当我年轻又愚蠢时,我就是这样做的:
# 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
。另请参阅:https://dev59.com/5lwY5IYBdhLWcg3wJU54#32960272
还要确保使用自己的干净链接器脚本:https://dev59.com/CWw15IYBdhLWcg3wGn9c#32594933
具有某些常见情况的工作示例的存储库: