我有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
但是,當我-Ttext=0x1000在ld命令中洗掉時,它產生了一個 120B 的 kernel.bin。
如果我理解正確,-Ttext=0x1000將為0x1000所有記憶體參考添加偏移量。為什么會產生如此大的差異?
uj5u.com熱心網友回復:
答案在@Peter Cordes 和@old_timer 的評論中。
首先將其構建為 elf 并使用readelf -a,我發現在0x080480d4(從 0x1000 開始大約 128MB)有一個段持有.note.gnu.property.
所以我添加這個聯結器腳本來丟棄 .note.gnu.property
/DISCARD/ : {
*(.note.gnu.property)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/326208.html
上一篇:試圖理解堆疊幀x86-64的內容
