JOS 2018版本linker script問題
02-18
2018版本的JOS和2017版本相比,能看出的一個改進就是修改了linker script,解決了高版本gcc編譯報錯的問題。可以git log看一下這個commit。
然而,在做lab3的時候,我發現這個linker script仍然有問題。具體的,在我用objdump或者readelf讀取kernel時候,可以看到bss段大小為0xf14:
然而,如果我們在init.c中加入調試輸出語句,輸出edata和end(由linker script自動生成的symbol,分別指向bss節的開始和結束), 可以看到:
edata的數值是正確的,但是end數值出現了問題;正確的值應該是
0xf018d100 + 0xf14 = 0xf018e014
而這一錯誤會導致lab3中的初始化代碼出錯。
我給MIT的Jonathan Behrens 教授發了一封郵件,他給了我現在他們正在用的linker script版本:
.bss : {
PROVIDE(edata = .);
*(.dynbss)
*(.bss .bss.*)
*(COMMON)
PROVIDE(end = .);
}
經過測試,這個版本在我的電腦上沒有問題。
我的環境:Ubuntu 18.04
gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
推薦閱讀: