在我的C项目中,我有一个用-fPIC编译的共享库,其中包含几个在全局范围内声明的静态数据结构,例如,
static struct mydata;
此库调用一个函数
void myfunc() {
char foo[2048] = {0};
...
}它在不同的共享库中定义。
当我编译我的主应用程序时,我链接了定义myfunc()的共享库。在运行时,主应用程序使用dlopen()加载包含静态数据结构的另一个共享库。
从声明了mydata的共享库中调用myfunc()会导致mydata至少部分被覆盖。
在使用gdb侦听之后,很明显本地数组foo放在内存中的方式与mydata的地址重叠,因此当数组初始化为0时,mydata也是如此。
这怎么可能呢?我是不是在做一些编译器无法处理的事情?
请注意,我在64位架构上运行的是Red Hat,使用的是gcc 4.6。
发布于 2014-04-13 09:47:32
这是怎么回事?
我见过这样的事情发生。当其他例程在堆栈上保留8MB缓冲区,并将堆栈溢出到数据区域时。
如果这个问题在ulimit -s unlimited中消失了,那么很有可能这也会发生在您身上。
在mydata刚刚损坏的位置,执行以下命令:
(gdb) p $rsp
(gdb) p $rbp
(gdb) p &mydata
(gdb) p &foo[0]
(gdb) info var mydata并使用结果更新您的问题。
https://stackoverflow.com/questions/22924011
复制相似问题