c - 我的二进制文件中的这些额外字节是什么?

标签 c gcc operating-system kernel

我正在用 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文件内容如下:

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

最佳答案

这些是额外的部分,没有被剥离也没有被丢弃。您希望您的 linker.ld 文件如下所示:

SECTIONS
{
    . = 0x7e00;

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

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

我知道从 objdump -t kernel.o 的输出中丢弃哪些部分。

关于c - 我的二进制文件中的这些额外字节是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11618327/

相关文章:

c - while 循环的链表问题,我应该使用 continue 吗?

c - 如何每四个循环以及每隔一个循环做一些事情?

c - snprintf 不工作 float

在 Ubuntu 17.10 上升级 CUDA-9.1 后预测包安装期间出现 R 错误

Java:通过 Runtime.getRuntime().exec() 转义操作系统相关调用的字符串的正确方法

python - 在python中获取系统状态

条件导数 - C 中的#define

在没有 root 的 Linux 中检查用户名/密码

c++ - (C++ 和 gcc) 错误 : expected constructor, 析构函数,或 'inline' 之前的类型转换

c - 逻辑和物理 I/O 之间的区别?