我正在用 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 个字节的用途。拆卸它们似乎会产生一堆没有任何意义的垃圾。额外字节的存在让我想知道我是否做错了什么。
我应该担心吗?
最佳答案
这些是额外的部分,没有被剥离也没有被丢弃。您希望您的 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/