之前一直在使用Ubuntu9.04 with Binutils 2.19 & gcc 3.4,很早之前就做完了Lab3

前天刚刚出了Ubuntu9.10,准备迁移工作环境

没想到同样的代码搬迁到了9.10之后三个程序报错。

从昨天晚上研究到今天凌晨,终于研究出了原因。

在Ubuntu 9.10中使用了Binutils 2.20,ld也随之升级。

ld的诡异行为误导了评分程序。

首先先来看readelf对我们的user程序的分析:

 

Code

从上面我们看到,原先将被加载到0x00200000的stab表,在ld2.20的处理下,加载到了0x00000080

这样,load_icode之后,用户程序的第一个page directory被分配,并且对User Mode可读。

偏偏在某些User Mode的测试程序中不允许我们这么做,例如buggyhello——

 

void
umain(
void)
{
    sys_cputs((
char*)11);
}

如果你让他可读,那就错了。因为评分程序认为,用户不该对第一个page directory中的任何page可读,因为这里不可能被分配嘛!

但是评分程序天真了,当他看到ld 2.20 奇迹般地将stab表放在了0x00000080之后……用户理所当然对第一个page directory的第一个page可读,但是评分程序不买账啊——

runtest1 buggyhello \
 '.00001000. user_mem_check assertion failure for va 00000001' \
 '.00001000. free env 00001000'

必须要有这两句呀!于是我就很悲剧地被扣分了。

解决办法:当然是把Binutils 给降回2.19咯,让stab表回0x00200000乖乖呆着去~

另外,TA评分的时候可别把BinUtils版本用的太高了。

posted on 2009-10-31 01:54  Latifrons  阅读(434)  评论(0编辑  收藏  举报