首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数中的局部变量重叠并占用共享对象中定义的静态全局变量的内存空间

问函数中的局部变量重叠并占用共享对象中定义的静态全局变量的内存空间
EN

Stack Overflow用户
提问于 2014-04-08 06:06:51
回答 1查看 540关注 0票数 0

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

static struct mydata;

此库调用一个函数

代码语言:javascript
复制
void myfunc() {
char foo[2048] = {0};
...
}

它在不同的共享库中定义。

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

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

在使用gdb侦听之后,很明显本地数组foo放在内存中的方式与mydata的地址重叠,因此当数组初始化为0时,mydata也是如此。

这怎么可能呢?我是不是在做一些编译器无法处理的事情?

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

EN

回答 1

Stack Overflow用户

发布于 2014-04-13 09:47:32

这是怎么回事?

我见过这样的事情发生。当其他例程在堆栈上保留8MB缓冲区,并将堆栈溢出到数据区域时。

如果这个问题在ulimit -s unlimited中消失了,那么很有可能这也会发生在您身上。

在mydata刚刚损坏的位置,执行以下命令:

代码语言:javascript
复制
(gdb) p $rsp
(gdb) p $rbp
(gdb) p &mydata
(gdb) p &foo[0]
(gdb) info var mydata

并使用结果更新您的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22924011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档