OS Lab3 with ld 2.20对stab表的处理方式更改导致评分程序判断错误详解

本文主要是介绍OS Lab3 with ld 2.20对stab表的处理方式更改导致评分程序判断错误详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

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

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

 

ContractedBlock.gif ExpandedBlockStart.gif Code
2.19.1

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00800020 006020 000ffc 00  AX  0   0  4
  [ 2] .rodata           PROGBITS        0080101c 00701c 000268 00   A  0   0  4
  [ 3] .data             PROGBITS        00802000 008000 000004 00  WA  0   0  4
  [ 4] .bss              NOBITS          00802004 008004 000008 00  WA  0   0  4
  [ 5] .stab_info        PROGBITS        00200000 001000 000010 00  WA  0   0  1
  [ 6] .stab             PROGBITS        00200010 001010 002a6d 0c   A  7   0  4
  [ 7] .stabstr          STRTAB          00202a7d 003a7d 00183a 00   A  0   0  1
  [ 8] .comment          PROGBITS        00000000 008004 0001a4 00      0   0  1
  [ 9] .shstrtab         STRTAB          00000000 0081a8 000057 00      0   0  1
  [10] .symtab           SYMTAB          00000000 0083e0 000440 10     11  24  4
  [11] .strtab           STRTAB          00000000 008820 000210 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x001000 0x00200000 0x00200000 0x042b7 0x042b7 RW  0x1000
  LOAD           0x006020 0x00800020 0x00800020 0x01264 0x01264 R E 0x1000
  LOAD           0x008000 0x00802000 0x00802000 0x00004 0x0000c RW  0x1000
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4

---------------------------------------------
BinUtils 2.20
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00800020 006020 000ffc 00  AX  0   0  4
  [ 2] .rodata           PROGBITS        0080101c 00701c 000268 00   A  0   0  4
  [ 3] .data             PROGBITS        00802000 008000 000004 00  WA  0   0  4
  [ 4] .bss              NOBITS          00802004 008004 000008 00  WA  0   0  4
  [ 5] .stab_info        PROGBITS        00200000 006000 000010 00  WA  0   0  1
  [ 6] .comment          PROGBITS        00000000 008004 00007d 00      0   0  1
  [ 7] .stab             PROGBITS        00000080 001080 002a6d 0c   A  8   0  4
  [ 8] .stabstr          STRTAB          00002aed 003aed 00183a 00   A  0   0  1
  [ 9] .shstrtab         STRTAB          00000000 008081 000057 00      0   0  1
  [10] .symtab           SYMTAB          00000000 0082b8 000440 10     11  24  4
  [11] .strtab           STRTAB          00000000 0086f8 000210 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x001080 0x00000080 0x00000080 0x042a7 0x042a7 R   0x1000
  LOAD           0x006000 0x00200000 0x00200000 0x00010 0x00010 RW  0x1000
  LOAD           0x006020 0x00800020 0x00800020 0x01264 0x01264 R E 0x1000
  LOAD           0x008000 0x00802000 0x00802000 0x00004 0x0000c RW  0x1000
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4

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

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

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

 

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

如果你让他可读,那就错了。因为评分程序认为,用户不该对第一个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版本用的太高了。

转载于:https://www.cnblogs.com/latifrons/archive/2009/10/31/1593378.html

这篇关于OS Lab3 with ld 2.20对stab表的处理方式更改导致评分程序判断错误详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234347

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON: