在我的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。
答案 0 :(得分:0)
怎么会这样?
我已经看到这种情况发生了...当其他一些例程在堆栈上保留8MB缓冲区,并且堆栈溢出到数据区域时。
如果问题因ulimit -s unlimited
而消失,那么您可能也会遇到这种情况。
在mydata
刚刚损坏的地方,执行以下命令:
(gdb) p $rsp
(gdb) p $rbp
(gdb) p &mydata
(gdb) p &foo[0]
(gdb) info var mydata
并用结果更新您的问题。