【发布时间】:2018-11-12 02:44:29
【问题描述】:
我只是有一个关于多个弱符号的潜在问题的问题,这个问题来自我的教科书:
一个模块A:
int x;
int y;
p1() {...}
另一个模块B:
double x;
p2() {...}
我的教科书说'在 p2 中写入 x 可能会覆盖 y' 我可以理解教科书的想法(double x 是 int x 大小的两倍,int y 放在 int x 之后,问题来了),但仍然迷失了细节,我知道何时有多个弱符号,链接器只会随机选择一个,所以我的问题是,链接器选择的模块的哪个 x 将导致写入 p2 中的 x 将覆盖 y。
这是我的理解:如果链接器选择模块A的int x会导致结果,因为那样x,y都是4个字节,p2(编译后的图像)是一个汇编代码 movq 与 p1 中的 movl 相比)将更改 8 个字节,因此覆盖 y。
但是我的导师说如果只有链接器选择模块B的双x,那会导致y覆盖,为什么,我是正确的还是我的导师是正确的?
【问题讨论】:
-
为什么老师会这样讲废话?这些不是弱符号,除非您正在为具有此类错误的软件编写漏洞利用程序,否则发生什么并不重要,因为否则它只是未定义的行为,您只是不这样做。