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

标签 assembly gcc linker operating-system ld

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

关于assembly - ld with -Ttext=0x1000 使文件非常大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69601952/

相关文章:

assembly - 是否有其他类似于 MOVZX 但在 8086 上支持的指令?

assembly - 用 8086 汇编语言打印十进制值

assembly - 如果目标文件定义了 _start 并且不使用任何库,为什么我仍然需要链接它才能执行它?

c - 为什么 GCC -O2 和 -O3 优化会破坏这个程序?

ios - 如何将适用于 iOS 的 Adob​​e AIR3 native 扩展链接到 iOS 框架?

汇编快速除以2

c++ - g++ 没有 gcc 也能工作吗?

Objective-C 2.0 在 GNUstep 中不工作

C: 相同签名函数的链接错误

linux - 对 `blacs_gridinfo_' 的 undefined reference