C 我的二进制文件中的这些额外字节是什么?
我正在用C编写一个小型操作系统。我已经编写了一个引导加载程序,现在我正在尝试获取一个简单的C文件(“内核”),以便使用C 我的二进制文件中的这些额外字节是什么?,c,gcc,operating-system,kernel,C,Gcc,Operating System,Kernel,我正在用C编写一个小型操作系统。我已经编写了一个引导加载程序,现在我正在尝试获取一个简单的C文件(“内核”),以便使用gcc进行编译: intmain(void){返回0;} 我使用以下命令编译该文件: gcc kernel.c -o kernel.o -nostdlib -nostartfiles 我使用链接器使用以下命令创建最终图像: ld kernel.o -o kernel.bin -T linker.ld --oformat=binary linker.ld文件的内容如下: SE
gcc
进行编译:
intmain(void){返回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)
}
}
但是,我不知道其他117个字节是干什么用的。分解它们似乎会产生一堆毫无意义的垃圾。额外字节的存在让我怀疑我是否做错了什么
我应该担心吗
这些是附加部分,没有剥离也没有丢弃。您希望您的
linker.ld
文件如下所示:
SECTIONS
{
. = 0x7e00;
.text ALIGN (0x00) :
{
*(.text)
}
/DISCARD/ :
{
*(.comment)
*(.eh_frame_hdr)
*(.eh_frame)
}
}
我知道要从
objdump-t kernel.o的输出中丢弃哪些部分,很简单,您使用的是gcc,它总是在将控制权传递给main之前放置其初始化代码。
启动代码上有什么我不知道,但它们在那里。正如您可能看到的,二进制文件上还有一条注释“GNU”,您不能使用objdump-s-j“section name”打印特定扇区。噢,是的,我知道生成的代码需要在保护模式下运行。引导加载程序将负责将CPU切换到保护模式。@Aftnix:我正在生成一个平面二进制文件。不应该有ELF头。在:strip--strip all-R.note-R.comment kernel.bin之后如何?也许这是调试信息?尝试类似的方法:ld kernel.o-o--strip all kernel.bin-T linker.ld--oformat=binary
SECTIONS
{
. = 0x7e00;
.text ALIGN (0x00) :
{
*(.text)
}
/DISCARD/ :
{
*(.comment)
*(.eh_frame_hdr)
*(.eh_frame)
}
}