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)
}
我有 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)
}