« 关于地表贴图 | 返回首页 | 安全的迭代一个集合 »

libstdc++ 卸载问题

今天,同事花了一下午时间,终于查到了 周末我碰到的问题 的根本原因。

是因为,GLU 是用 C++ 实现的,而导致 libstdc++.so 会跟随它卸载,而 libstdc++.so 本身有一个 bug ,导致程序崩溃。

当然,显露这个 bug 还有一个前提,我的程序是纯 C 写的,完全没有用到 libstdc++ 。

有兴趣的同学可以查看这个帖子:http://unix.derkeiler.com/pdf/Mailing-Lists/FreeBSD/stable/2006-05/msg00719.pdf

大约是说,crtbeginS.o (C 的运行时库)里有个叫 __deregister_frame_info 的弱符号在 libstdc++.so 加载的时候被重定位到这个 so 的代码段里了,并且在程序退出的时候会运行到。

但是程序退出前,libstdc++.so 已经被卸载,这就会导致进程运行到不存在的地址空间。

以上问题存在于 libstdc++.so.5 ,我在 libstdc++.so.6 下测试貌似没有问题了。

Comments

c++就是这点不好,充满了神秘……类似的问题貌似其他语言就少很多,也可能是我见识浅薄吧,呵呵

学习了

Post a comment

非这个主题相关的留言请到:留言本