myk的6.828
首发于myk的6.828
JOS 2018版本linker script问题

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)

发布于 2018-10-15

文章被以下专栏收录