我的二进制文件中的这些额外字节是多少?

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个字节的用途.拆解它们似乎会产生一堆没有任何意义的垃圾.附加字节的存在让我想知道我是否做错了什么.

我应该担心吗?

hexdump文件

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.