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)¶
- 不存在关联,m1中没有对main的引用
- m1.main
- m2.p1
- 不存在关联,x是局部变量
- 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