mockcpp的so加载失败问题
一、先来看之前已解决的六个so无法加载的问题。
把libmockcpp-ut-TestReturnObjectList.so拿来做例子研究so加载问题。
加载成功时的预处理后的.cpp,编译产生的.o.sym/asm,最后的.so.sym
加载不成功时的同样文件。
命令如下:
获取预处理文件:
/usr/bin/c++ -Dmockcpp_ut_TestChainableMockMethod_EXPORTS -DPACKAGE_NAME=\"mockcpp\" -DPACKAGE_STRING=\"mockcpp\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"http://code.google.com/p/mockcpp\" -DPACKAGE=\"mockcpp\" -DVERSION=\"2.4\" -fPIC -I/home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/3rdparty/testngpp/include -I/home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/../3rdparty -I/home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/../include -I/home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/ut/. -o AAAAAA.d -E /home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/ut/TestReturnObjectList.cpp
获取反汇编文件:
objdump -D xxxx.o
获取so的符号表:
nm -D xxx.so
1、预处理文件差异。
2、nm so文件差异。
根据上面情况,已经能看出是result符号链接不到所致。也许编译器认为extern的一个const变量应该有一个变量实体与它对应。
由此,这个问题可以修改如下:(把有差异的两行代码改为下面这样)
const Any& result2 = Any();
return getResult(result2, resultProvider);
果然编译链接通过,用例也都运行通过。
二、再来看TestApiHook.so加载不成功的问题。
它从来都没有被加载成功过,定位难度较大。
查找.o的方法:
jelly@jelly-linux:~/Programming/mockcpp/build_tests/ut/CMakeFiles/TestApiHook.dir$ find .. -name "TestApiHook.cpp.o"
../mockcpp-ut-TestApiHook.dir/TestApiHook.cpp.o
注释掉两行,加载成功,运行时段错误:
SETUP()
{
MOCKER(func)
.expects(once());
//.with(eq(a), eq(b))
//.will(returnValue(ret));
}
(TestApiHook)
./build.sh: line 18: 9062 段错误 ../../build_testngpp/src/runner/testngpp-runner $(ls *.so) -L"../../build_testngpp/src/listeners" -l"testngppstdoutlistener -c -f"
而且,偶然发现,下面有用例也用到with,will,怎么SETUP中用到就加载失败呢。
--------------------------------
比较下面一处with/will与上面的差异,只不过上面用了static const int 变量。
于是,把它们改为普通成员变量,果然加载成功了。但有段错误问题:./build.sh: line 18: 10109 段错误
--- tests/ut/TestApiHook.h (版本 434)
+++ tests/ut/TestApiHook.h (工作副本)
@@ -36,12 +36,15 @@
FIXTURE(ApiHook)
{
- static const int a = 3;
- static const int b = 5;
- static const int ret = 10;
+ int a;
+ int b;
+ int ret;
SETUP()
{
+ a = 3;
+ b = 5;
+ ret = 10;
MOCKER(func)
.expects(once())
.with(eq(a), eq(b))
-------------------------------------
现在就只是还有段错误问题。