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

时间:2012-07-23 18:30:24

标签: c gcc operating-system kernel

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

我应该担心吗?

hexdump of the file

2 个答案:

答案 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'节名称'来打印特定扇区。