习题
5. 假设一个 C 语言程序有两个源文件:main.c 和 proc1.c,它们的内容如图 4.24 所示。
图 4.24 题 5 用图
回答下列问题。
(1)在上述两个文件中出现的符号哪些是强符号?哪些是弱符号?
(2)程序执行后打印的结果是什么?请分别画出执行第 7 行的 proc1()函数调用前、后,在地址&x 和
&z 中存放的内容。
(3)修改文件 proc1,使得 main.c 能输出正确的结果(即 x=257, z=2)。要求修改时不能改变任何变
量的数据类型和名字。
参考答案:
(1)在上述两个文件中,main.c 中的强符号有 x、z、main,弱符号有 y;proc1.c 中的强符号有 proc1,
弱符号有 x。其中,符号 x 在 main.c 和 proc1.c 中都有定义,属于多重定义符号。根据多重定义
符号处理规则 2(若一个符号被说明为一次强符号定义和多次弱符号定义,则按强符号定义为
准),符号 x 的定义以 main.c 中的强符号 x 为准,即在 main.o 的.data 节中分配 x,占 4 个字节,
随后两个字节存放 y,再后面两个字节存放 z。
(2)程序执行时,在调用 proc1()函数之前,&x 中存放的是 x 的机器数:00000101H,随后两个字节
(地址为&y)存放 y,它没有初始化,故通常为 0;再后面两个字节存放 z 的机器数:0002H。
如下左图所示:
在调用 proc1()函数以后,因为 proc1()中的符号 x 是弱符号,因此,x 的定义以 main 中的强符号
x 为准,执行 x=-1.5 后,便将“-1.5”的机器数 BFF80000 00000000H 存放到了&x 开始的 8 个
字节中。即&x 中为其低 32 位的 00000000H,&y 中为高 32 位的 BFF80000H 中的低 16 位 0000H,
&z 中为高 32 位的 BFF80000H 中的高 16 位 BFF8H。如上右图所示。
因此,最终打印的结果如下:x=0, z=-16392。
(3)只要将文件 proc1.c 中的第 1 行修改为“static double x;”就可以使得 proc1 中的 x 设定为本地变
量,从而在 proc1.o 的.data 节中专门分配存放 x 的 8 个字节空间,而不会和 main 中的 x 共用同
一个存储地址。因此,也就不会破坏 main 中 x 和 z 的值。