我正在用C编写一个小型操作系统。我已经编写了一个bootloader,我现在正在尝试使用gcc
编译一个简单的C文件(“内核”):< / p>
int main(void) { return 0; }
我使用以下命令编译文件:
gcc kernel.c -o kernel.o -nostdlib -nostartfiles
我使用链接器使用以下命令创建最终图像:
ld kernel.o -o kernel.bin -T linker.ld --oformat=binary
linker.ld
文件的内容如下:
SECTIONS { . = 0x7e00; .text ALIGN (0x00) : { *(.text) } }
(引导加载程序将图像加载到地址0x7e00
。)
这似乎工作得很好 - ld
生成一个128字节的文件,其中包含前11个字节中的以下指令:
00000000 55 push ebp 00000001 48 dec eax 00000002 89 E5 mov ebp, esp 00000004 B8 00 00 00 00 mov eax, 0x00000000 00000009 5D pop ebp 0000000A C3 ret
但是,我无法弄清楚其他117个字节的含义。拆解它们似乎会产生一堆没有任何意义的垃圾。附加字节的存在让我想知道我是否做错了。
我应该担心吗?
答案 0 :(得分:9)
这些是附加部分,未被剥离而不会被丢弃。您希望linker.ld
文件看起来像这样:
SECTIONS
{
. = 0x7e00;
.text ALIGN (0x00) :
{
*(.text)
}
/DISCARD/ :
{
*(.comment)
*(.eh_frame_hdr)
*(.eh_frame)
}
}
我知道要从objdump -t kernel.o
的输出中丢弃哪些部分。
答案 1 :(得分:0)
很简单,你正在使用gcc,它总是在将控制传递给你的main之前放置它的初始化代码。 我不知道的启动代码是什么,但它们就在那里。正如您可能会看到在二进制文件上还有一个注释“GNU”,您无法使用objdump -s -j'节名称'来打印特定扇区。