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
本页的评论功能已关闭