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

5

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

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

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

请参见http://www.nasm.us/doc/nasmdoc7.html获取更多信息。

PS: 我想制作一个“纯二进制”文件,在QEMU中启动。


你是在描述链接过程还是其他什么? - fstab
1
所有文件都是原始二进制文件。你实际上想用 .o 做什么? - Tom Tanner
3
“一个没有包含在可执行文件中的详细信息的简单二进制代码” 仍然不太清楚。 - wRAR
2
我猜他想要一份机器可读的代码,以在裸机上运行(无需操作系统)。 - Vitor
1
@Vitor 这就是我想要的! - Pratik Singhal
显示剩余10条评论
2个回答

5

这让我想起了过去。我相信使用链接脚本可能会有更好的方法,但当我年轻又愚蠢时,我就是这样做的:

# 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
"

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 具有某些常见情况的工作示例的存储库:

类似问题:如何使用GNU GAS汇编器生成像nasm -f bin这样的纯二进制文件?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接