Skip to content

U4

211275022田昊东

3

符号 是否在test.o符号表中 定义模块 符号类型
a main 外部 .data
val test 全局 .data
sum test 全局 .text
i \ \ \

4

符号 是否在swap.o符号表中 定义模块 符号类型
buf main 外部 .data
bufp0 swap 全局 .data
bufp1 swap 本地 .bss
incr swap 本地 .text
count swap 本地 .data
swap swap 全局 .text
temp \ \ \

5

  • (1)

  • 强符号:

    • unsigned x
    • short z
    • void procl()
    • void main()
  • 弱符号:

    • short y
    • void procl(void)
    • double x
  • (2)

  • 在procl中x被声明为double,因此double会覆盖.data中x和y的内容

  • 将-1.5用64位浮点数表示:

    • 因为是负数,因此符号位为1
    • 底数为1.5,即1.1
    • 阶码为0+1023
    • 因此二进制表示为1 01111111111 1000000000000000000000000000000000000000000000000000
    • 转化为十六进制表示BFF80000 00000000
  • 打印结果:x=0,z=0

    • z中内容为0000,即0
  • 阶段(16进制) &x &z
    调用前 01 01 00 00 02 00
    调用后 00 00 00 00 00 00
  • 修改后打印结果:x=0,z=-16392

    • z中的内容为BFF8,为负数,其原码为C008,即-16392
  • (3)

  • 将第一行改为static double x,即将x修改为局部符号,防止其修改破坏main中的数据

6(3)

  1. 不存在关联,m1中没有对main的引用
  2. m1.main
  3. m2.p1
  4. 不存在关联,x是局部变量
  5. m2.x

7

  • main在m1中为强符号,在m2中为弱符号,因此m2中的main是对m1中main函数的引用。
  • 因此main[0],main[1]就是main函数中指令的前两个字节,即55 89

8

  • 这是由.bss节造成的,.bss节中保存未初始化的全局变量,只标记应该为这部分内容预留的空间的大小,但这部分实际上并不占用物理存储的空间。
  • 因此在文件大小filesz中只包含.data的数据大小,而虚拟地址空间大小包含了.bss的大小(.bss应占据了28字节),因此其大小存在差异。

9

  • (1)
  • gcc -static -o p.o libx.a liby.a
  • (2)
  • gcc -static -o p.o libx.a liby.a libx.a
  • (3)
  • gcc -static -o p.o libx.a liby.a libx.a libz.a

10

  • 符号名:swap
  • 位移:7
  • 行号:6
  • 重定位类型:R_386_PC32相对寻址

  • 重定位前的内容fffffffc(init=-4)

  • 重定位后的内容:
  • swap的起始地址:
    • 0x8048386+12=0x8048398已经按照4字节对齐
  • 0x8048398-(0x8048386+7-(-4))=7
  • 故为07 00 00 00