函数中的局部变量与共享对象中定义的静态全局变量的内存空间重叠

时间:2014-04-07 22:06:51

标签: c unix gcc shared-libraries dlopen

在我的C项目中,我有一个用-fPIC编译的共享库,其中包含在全局范围内声明的几个静态数据结构,包括,让我们说,

static struct mydata;

此库调用函数

void myfunc() {
char foo[2048] = {0};
...
}

在不同的共享库中定义。

当我编译我的主应用程序时,我链接在定义myfunc()的共享库中。在运行时,主应用程序使用dlopen()加载包含静态数据结构的其他共享库。

从声明myfunc()的共享库中调用mydata会导致mydata至少部分被覆盖。

在使用gdb进行窥探后,很明显本地数组foo以与mydata地址重叠的方式放在内存中,因此当数组初始化时为{0},mydata也是如此。

怎么会这样?我做的是编译器未处理的事情吗?

请注意,我使用gcc 4.6在64位架构上运行Red Hat。

1 个答案:

答案 0 :(得分:0)

  

怎么会这样?

我已经看到这种情况发生了...当其他一些例程在堆栈上保留8MB缓冲区,并且堆栈溢出到数据区域时。

如果问题因ulimit -s unlimited而消失,那么您可能也会遇到这种情况。

mydata刚刚损坏的地方,执行以下命令:

(gdb) p $rsp
(gdb) p $rbp
(gdb) p &mydata
(gdb) p &foo[0]
(gdb) info var mydata

并用结果更新您的问题。