8

我正在用 C 编写一个小型操作系统。我已经编写了一个引导加载程序,现在我正在尝试获取一个简单的 C 文件(“内核”)来编译gcc

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文件的内容如下:

部分
{
    . = 0x7e00;

    .文本对齐(0x00):
    {
        *(。文本)
    }
}

(引导加载程序在地址加载映像0x7e00。)

这似乎工作得很好——ld生成一个 128 字节的文件,在前 11 个字节中包含以下指令:

00000000 55 推送 ebp
00000001 48 dec eax
00000002 89 E5 移动 ebp, esp
00000004 B8 00 00 00 00 移动 eax, 0x00000000
00000009 5D pop ebp
0000000A C3 RET

但是,我无法弄清楚其他 117 个字节的用途。拆卸它们似乎会产生一堆没有任何意义的垃圾。额外字节的存在让我想知道我是否做错了什么。

我应该担心吗?

文件的十六进制转储

4

2 回答 2

12

这些是额外的部分,没有被剥离也没有被丢弃。你希望你的linker.ld文件看起来像这样:

SECTIONS
{
    . = 0x7e00;

    .text ALIGN (0x00) :
    {
        *(.text)
    }

    /DISCARD/ :
    {
        *(.comment)
        *(.eh_frame_hdr)
        *(.eh_frame)
    }
}

我知道要从objdump -t kernel.o.

于 2012-07-23T19:02:48.807 回答
-1

很简单,您使用的是 gcc,它总是在将控制权传递给您的 main 之前放置其初始化代码。我不知道启动代码上有什么,但它们就在那里。正如您可能看到的,在您的二进制文件中还有一个注释“GNU”,您无法使用 objdump -s -j 'section name' 打印特定扇区。

于 2012-07-23T19:32:09.207 回答