|
|
项目中出现了Segfault问题,实在搞不清楚为什么会这样,向各位求解。
不知是否遇到过类似情况。
问题:
1) 是不是系统的兼容性存在问题。
2) 有什么解决办法么?
编译环境: RHEL AS3 EM64T
运行环境: RHEL AS4 EM64T (kernel 2.6.34)
将程序结构简化,并写了一个测试小程序。
测试小程序说明:
1) loadlib.dll中封装了两个函数,分别调用了dlopen和dlclose。
2) main.c中利用loadlib.dll里的函数加载lib1.so和lib2.so
3) lib1.so中动态加载了系统的库libm.so
调用关系如下:
test(loadlib.dll) (gcc编译)
|- lib1.so (g++编译)
| `- libm.so (系统的库)
`- lib2.so (g++编译)
再现方法:
1)RHEL3(EM64T)中将附件的tgz解压缩
tar xvzf test.tgz
包含如下目录:
test/main
test/lib12
2)按如下方法做成lib1.so和lib2.so,并拷贝至test/main下
#cd test/lib12
#make
#cp lib1.so lib2.so ../main
3)按照如下方法做成loadlib.dll和test。
#cd test/main
#make
注:做成test时使用了-lefence链接了ElectricFence内存检查库。
4)将以上的各个文件拷贝至RHEL4(EM64T)环境、执行test/main下的test则会
导致segfault。
但是在RHEL3(EM64T)上执行则没有问题。
※RHEL4(EM64T)环境中通过步骤3)再生成loadlib.dll和test时仍然会segfault。
※RHEL4(EM64T)环境中只要重新编译了lib1.so和lib2.so之一都不会再产生segfault。
※segfault的backtrace信息如下:
Program received signal SIGSEGV, Segmentation fault.
0x00000039a4e073b9 in do_lookup_x () from /lib64/ld-linux-x86-64.so.2
(gdb) backtrace
#0 0x00000039a4e073b9 in do_lookup_x () from /lib64/ld-linux-x86-64.so.2
#1 0x00000039a4e0784e in _dl_lookup_symbol_x () from /lib64/ld-linux-x86-64.so.2
#2 0x00000039a4e0a63a in fixup () from /lib64/ld-linux-x86-64.so.2
#3 0x00000039a4e0a502 in _dl_runtime_resolve () from /lib64/ld-linux-x86-64.so.2
#4 0x0000002a95a0b8d0 in std::ctype_byname<wchar_t>::ctype_byname ()
from /usr/lib64/libstdc++.so.5
#5 0x00000039a5230f4b in __cxa_finalize () from /lib64/tls/libc.so.6
#6 0x0000002a95a07877 in ?? () from /usr/lib64/libstdc++.so.5
#7 0x0000007fbffff430 in ?? ()
#8 0x0000002a95a5d701 in ?? () from /usr/lib64/libstdc++.so.5
#9 0x0000007fbffff3b0 in ?? ()
#10 0x00000039a52f85d7 in _dl_close () from /lib64/tls/libc.so.6
Previous frame inner to this frame (corrupt stack?) |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|