A Blog of WNico

OS Lab1 实验报告

Lab1 实验报告

Thinking1.1

请阅读附录中的编译链接详解,尝试分别使用实验环境中的原生 x86 工具 链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有 mips-linux-gnu前缀),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参数的含义。

使用原生 x86 测试,发现链接前后,main函数中 call 项出现了 printf() 函数的地址,比较发现 printf 的地址在文件中 eb fe ff ff 位置

    # 链接
    1160:    e8 eb fe ff ff           call   1050 <printf@plt>
    # 无链接
    17:    e8 00 00 00 00           call   1c <main+0x1c>

换用 mips 工具,发现变化主要在于三行

# 无链接
  14:    279c0000     addiu    gp,gp,0
  20:    24440000     addiu    a0,v0,0
  24:    8f820000     lw    v0,0(gp)
# 链接
  4006f4:    279c9010     addiu    gp,gp,-28656
  400700:    24440830     addiu    a0,v0,2096
  400704:    8f828030     lw    v0,-32720(gp)
# 部分代码
  4006f0:    3c1c0042     lui    gp,0x42
  4006f4:    279c9010     addiu    gp,gp,-28656
  4006f8:    afbc0010     sw    gp,16(sp)
  4006fc:    3c020040     lui    v0,0x40
  400700:    24440830     addiu    a0,v0,2096
  400704:    8f828030     lw    v0,-32720(gp)
  400708:    0040c825     move    t9,v0
  40070c:    0320f809     jalr    t9
  400710:    00000000     nop

因而认为三行的计算是用于计算出printf地址的

向 objdump 输入的选项 -DS-D-S 的混合,分别代表反汇编所有代码段,显示所有指令、将源代码和反汇编的指令混合显示,若对象文件包含调试信息;下一个参数为反汇编的目标文件

Thinking1.2

思考下述问题:

• 尝试使用我们编写的 readelf 程序,解析之前在 target 目录下生成的内核 ELF 文 件。

• 也许你会发现我们编写的 readelf 程序是不能解析 readelf 文件本身的,而我们刚 才介绍的系统工具 readelf 则可以解析,这是为什么呢?(提示:尝试使用 readelf -h,并阅读 tools/readelf 目录下的 Makefile,观察 readelf 与 hello 的不同)

解析结果:

0:0x0
1:0x80010000
2:0x80011d00
3:0x80011d18
4:0x80011d30
5:0x0
6:0x0
7:0x0
8:0x0
9:0x0
10:0x0
11:0x0
12:0x0
13:0x0
14:0x0
15:0x0
16:0x0

观察 Makefile 文件,发现 hello 文件的编译选线存在 -m32

本页的评论功能已关闭