Nat*_*man 7 c gcc operating-system kernel
我正在用C编写一个小型操作系统.我已经编写了一个bootloader,我现在正在尝试使用gcc以下代码编译一个简单的C文件("内核"):
int main(void) { return 0; }
Run Code Online (Sandbox Code Playgroud)
我使用以下命令编译该文件:
gcc kernel.c -o kernel.o -nostdlib -nostartfiles
Run Code Online (Sandbox Code Playgroud)
我使用链接器使用此命令创建最终图像:
ld kernel.o -o kernel.bin -T linker.ld --oformat=binary
Run Code Online (Sandbox Code Playgroud)
该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个字节的用途.拆解它们似乎会产生一堆没有任何意义的垃圾.附加字节的存在让我想知道我是否做错了什么.
我应该担心吗?

xai*_*zek 11
这些是附加部分,未被剥离而不被丢弃.您希望linker.ld文件看起来像这样:
SECTIONS
{
. = 0x7e00;
.text ALIGN (0x00) :
{
*(.text)
}
/DISCARD/ :
{
*(.comment)
*(.eh_frame_hdr)
*(.eh_frame)
}
}
Run Code Online (Sandbox Code Playgroud)
我知道从输出中丢弃哪些部分objdump -t kernel.o.