7.6
符号 |
swap.o.symtab条目? |
符号类型 |
定义符号的模块 |
节 |
---|---|---|---|---|
buf |
是 |
外部 |
m.o |
.data |
bufp0 |
是 |
全局 |
swap.o |
.data |
bufp1 |
是 |
局部 |
swap.o |
.data |
swap |
是 |
全局 |
swap.o |
.bss |
temp |
否 |
—— |
—— |
—— |
incr |
是 |
局部 |
swap.o |
.text |
count |
是 |
局部 |
swap.o |
.bss |
7.7
将double x
移入函数或者在前面加static
。
7.8
A
REF(main.1)->DEF(main.1)
REF(main.2)->DEF(main.2)
B
未知
C
错误
7.9
foo6.c
中的main
是强符号,bar6.c
中的main
是弱符号,弱符号被强符号所屏蔽,而编译时则仍然按照弱符号的char
进行编译和打印一个字节,所以会打印main
开始的一个字节,正好是push %ebp
,值为0x55
。
书上为0x48
,可能是系统不同导致的。
7.10
A
gcc p.o libx.a
B
gcc p.o libx.a liby.a libx.a
C
gcc p.o libx.a liby.a libx.a libz.a
7.11
剩下的个字节对应于运行时将被初始化为的.bss
数据。
7.12
A
0xa
B
0x22
只需要计算出下一条指令到swap
的距离即可。
7.13
A
找到libm.a
所在位置,在我的机器上位置在/usr/lib32
。
使用命令:
dyume@LAPTOP-LLU88NPC:/usr/lib32$ ar -t ./libm.a
得到所有的目标文件。
libc.a
同理。
B
编译后观察目标文件发现没有区别。
-g
只是让编译器在编译阶段产生调试信息。
C
dyume@LAPTOP-LLU88NPC:/usr/bin$ ldd ./gcc
linux-vdso.so.1 (0x00007ffd03d2e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9f8e72a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9f8e928000)