JOS 2018版本linker script問題

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)

推薦閱讀:

TAG:科技 | 計算機科學 |