ld with -Ttext=0x1000 使文件非常大

ld with -Ttext=0x1000 makes the file very big

我有 kernel.c 文件如下所示

void main() {
    char *video_memory = (char *)0xb8000;
    *video_memory = 'X';
}

我编译并链接了这两个命令:

gcc -ffreestanding -c ./src/kernel/kernel.c -o kernel.o -m32 -mtune=i386 -fno-pie
ld -o kernel.bin -Ttext=0x1000 kernel.o --oformat binary -m elf_i386 --strip-all -nmagic

它产生了 128MB kernel.bin
但是,当我在 ld 命令中删除 -Ttext=0x1000 时,它产生了一个 120B kernel.bin.

如果我没理解错的话,-Ttext=0x1000 会将偏移量 0x1000 添加到所有内存引用中。为什么会有这么大的不同?

答案在@Peter Cordes 和@old_timer 的评论中。

首先将它构建为 elf 并使用 readelf -a,我发现在 0x080480d4 处有一个段(从 0x1000 开始大约 128MB)持有 .note.gnu.property.

所以我添加了这个链接描述文件来丢弃 .note.gnu.property

/DISCARD/ : {
    *(.note.gnu.property) 
}