StupidBeauty
Read times:1769Posted at:Mon Oct 21 01:41:12 2013
- no title specified

不同版本的libqxt共存,导致Symbol `_ZTV21QxtHttpSessionManager' has different size in shared object, consider re-linking

一个使用 libqxt的项目,在运行过程中会崩溃,而在崩溃之前能够看到的线索就是这样的警告消息:

调试开始

&"warning: GDB: Failed to set controlling terminal: Invalid argument\n"

/RemoteWeb/SoftwareDevelop/HongKongLunchProject/build-QueueMateServer-Desktop-Debug/CdpChargeResultReceiver: Symbol `_ZTV21QxtHttpSessionManager' has different size in shared object, consider re-linking

/RemoteWeb/SoftwareDevelop/HongKongLunchProject/build-QueueMateServer-Desktop-Debug/CdpChargeResultReceiver: Symbol `_ZTV28QxtAbstractWebSessionManager' has different size in shared object, consider re-linking

经过一番研究之后,找到了这个崩溃的原因。简单来说,系统中有 libqxt0.7.0和libqxt0.6.2共存了。

之前本座从 libqxt的代码仓库里下载最新活跃代码并且编译安装了,它所产生出来的共享库是 0.7.0版本的,例如:

libQxtWeb.so.0.7.0

libQxtWeb.so.0 (链接至libQxtWeb.so.0.7.0)

后来,本座又下载了 libqxt的一个最新稳定版本, libqxt0.6.2。并且打包成RPM,安装了。它所产生出来的共享库是0.6.2版本的,例如:

libQxtWeb.so.0.6.2

libQxtWeb.so (链接至libQxtWeb.so.0.6.2)

就是这种共存状态,引起了本座一开头所说的崩溃。

在本座的使用到了 libqxt的 项目被编译的时候,是 这样链接的:

g++ -Wl,-rpath,/usr/lib/qt4/lib -Wl,-rpath,/Entertain/rpmbuild/BUILDROOT/libqxt-0.6.2-7mgc26.i386/usr/lib -o CdpChargeResultReceiver main.o WebServer.o WebService.o CheckPhoneNumberService.o PhoneNumberCheckResult.o QueryPhoneChargePriceService.o PhoneChargePriceResult.o CheckLoginService.o ManagedUser.o MoneyFlow.o CheckLoginResult.o RegisterService.o RegisterResult.o CommitOrderService.o CommitOrderResult.o Good.o CommitOrderGameService.o hz2py.o goodlistsection.o QueryGameAreaService.o GameArea.o GameAreaResult.o ModifyPasswordService.o ModifyPasswordResult.o Order.o Order4Json.o QueryOrderListResult.o GoodNameRegistry.o AssignGiftService.o QueryMyDataService.o QueryMyDataResult.o QueryFlowListResult.o Flow4Json.o StupidClicker.o SmsVerifyService.o SmsVerifyResult.o moc_WebServer.o moc_WebService.o moc_CheckPhoneNumberService.o moc_PhoneNumberCheckResult.o moc_QueryPhoneChargePriceService.o moc_PhoneChargePriceResult.o moc_CheckLoginService.o moc_CheckLoginResult.o moc_RegisterService.o moc_RegisterResult.o moc_CommitOrderService.o moc_CommitOrderResult.o moc_Good.o moc_CommitOrderGameService.o moc_goodlistsection.o moc_QueryGameAreaService.o moc_GameArea.o moc_GameAreaResult.o moc_ModifyPasswordService.o moc_ModifyPasswordResult.o moc_Order4Json.o moc_QueryOrderListResult.o moc_GoodNameRegistry.o moc_AssignGiftService.o moc_QueryMyDataService.o moc_QueryMyDataResult.o moc_QueryFlowListResult.o moc_Flow4Json.o moc_StupidClicker.o moc_SmsVerifyService.o moc_SmsVerifyResult.o -L/usr/lib/qt4/lib -L/RemoteWeb/SoftwareDevelop/HongKongLunchProject/QueueMateServer/../../../../usr/lib/ -lQxtWeb -lqjson -lwtdbo -lwt -lwtdbosqlite3 -L/Entertain/rpmbuild/BUILDROOT/libqxt-0.6.2-7mgc26.i386/usr/lib -lQxtCore -lQtXml -L/usr/lib/qt4/lib -lQtNetwork -lQtCore -lpthread

这样,它是链接到了 libQxtWeb.so ,即链接到了libQxtWeb.so.0.6.2。

ld在运行时是这样动态链接的:

bash-4.2# ldd CdpChargeResultReceiver

linux-gate.so.1 => (0xb7790000)

libQxtWeb.so.0 => /usr/lib/libQxtWeb.so.0 (0xb76fc000)

libqjson.so.0 => /usr/lib/libqjson.so.0 (0xb76d6000)

libwtdbo.so.34 => /usr/lib/libwtdbo.so.34 (0xb7654000)

libwt.so.34 => /usr/lib/libwt.so.34 (0xb7010000)

libwtdbosqlite3.so.34 => /usr/lib/libwtdbosqlite3.so.34 (0xb6f70000)

libQxtCore.so.0 => /usr/lib/libQxtCore.so.0 (0xb6ea8000)

libQtXml.so.4 => /usr/lib/qt4/lib/libQtXml.so.4 (0xb6e68000)

libQtNetwork.so.4 => /usr/lib/qt4/lib/libQtNetwork.so.4 (0xb6d2e000)

libQtCore.so.4 => /usr/lib/qt4/lib/libQtCore.so.4 (0xb6a49000)

libpthread.so.0 => /lib/libpthread.so.0 (0xb6a2e000)

libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6946000)

libm.so.6 => /lib/libm.so.6 (0xb6906000)

libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb68e9000)

libc.so.6 => /lib/libc.so.6 (0xb6733000)

libQxtNetwork.so.0 => /Poi/Qt/AndroidChargeProject/libqxt/build-libqxt-Desktop-Debug/lib/libQxtNetwork.so.0 (0xb66a9000)

libboost_thread-mt.so.1.50.0 => /usr/lib/libboost_thread-mt.so.1.50.0 (0xb668a000)

libboost_system-mt.so.1.50.0 => /usr/lib/libboost_system-mt.so.1.50.0 (0xb6687000)

libboost_date_time-mt.so.1.50.0 => /usr/lib/libboost_date_time-mt.so.1.50.0 (0xb6679000)

libboost_random-mt.so.1.50.0 => /usr/lib/libboost_random-mt.so.1.50.0 (0xb6676000)

libboost_regex-mt.so.1.50.0 => /usr/lib/libboost_regex-mt.so.1.50.0 (0xb656a000)

libboost_signals-mt.so.1.50.0 => /usr/lib/libboost_signals-mt.so.1.50.0 (0xb6555000)

libboost_filesystem-mt.so.1.50.0 => /usr/lib/libboost_filesystem-mt.so.1.50.0 (0xb6540000)

libssl.so.10 => /usr/lib/libssl.so.10 (0xb64e4000)

libcrypto.so.10 => /lib/libcrypto.so.10 (0xb6340000)

libdl.so.2 => /lib/libdl.so.2 (0xb633a000)

libz.so.1 => /usr/lib/libz.so.1 (0xb6323000)

libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb6321000)

librt.so.1 => /lib/librt.so.1 (0xb6318000)

libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb61ea000)

/lib/ld-linux.so.2 (0xb7791000)

libboost_chrono-mt.so.1.50.0 => /usr/lib/libboost_chrono-mt.so.1.50.0 (0xb61e2000)

libicuuc.so.49 => /usr/lib/libicuuc.so.49 (0xb6073000)

libicui18n.so.49 => /usr/lib/libicui18n.so.49 (0xb5e73000)

libicudata.so.49 => /usr/lib/libicudata.so.49 (0xb4d52000)

libgssapi_krb5.so.2 => /lib/libgssapi_krb5.so.2 (0xb4d0f000)

libkrb5.so.3 => /lib/libkrb5.so.3 (0xb4c30000)

libcom_err.so.2 => /usr/lib/libcom_err.so.2 (0xb4c2c000)

libk5crypto.so.3 => /lib/libk5crypto.so.3 (0xb4c01000)

libresolv.so.2 => /lib/libresolv.so.2 (0xb4be8000)

libkrb5support.so.0 => /lib/libkrb5support.so.0 (0xb4bde000)

libkeyutils.so.1 => /lib/libkeyutils.so.1 (0xb4bda000)

它是链接到了 libQxtWeb.so.0,即链接到了libQxtWeb.so.0.7.0。

而与libqxt的其它模块链接时也是类似的冲突状态。

由于 libqxt0.7.0与libqxt0.6.2中代码的不同,导致 `_ZTV21QxtHttpSessionManager' `_ZTV28QxtAbstractWebSessionManager' 两个符号在两个版本共享库中的对应尺寸都不一样。

这样 ,在运行时,系统检测到现在所链接到的 libqxt库中符号的尺寸与原来编译时链接到的libqxt库中符号的尺寸不一致,就给出了警告。而当真正有WebService的请求过来时,程序就直接在libqxt的库里面崩溃了。

0 typeinfo name for WebServer 0x80c4578

1 QxtAbstractHttpConnector::incomingData qxtabstracthttpconnector.cpp 241 0xb7f992f4

2 QxtAbstractHttpConnector::qt_static_metacall moc_qxtabstracthttpconnector.cpp 53 0xb7fc1e8d

3 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) /usr/lib/qt4/lib/libQtCore.so.4 0xb744d656

4 QIODevice::readyRead() /usr/lib/qt4/lib/libQtCore.so.4 0xb749ba65

5 ?? /usr/lib/qt4/lib/libQtNetwork.so.4 0xb76604a9

6 ?? /usr/lib/qt4/lib/libQtNetwork.so.4 0xb76508b9

7 ?? /usr/lib/qt4/lib/libQtNetwork.so.4 0xb7669f0b

8 QCoreApplicationPrivate::notify_helper(QObject*, QEvent*) /usr/lib/qt4/lib/libQtCore.so.4 0xb7435708

9 QCoreApplication::notify(QObject*, QEvent*) /usr/lib/qt4/lib/libQtCore.so.4 0xb7435774

10 QCoreApplication::notifyInternal(QObject*, QEvent*) /usr/lib/qt4/lib/libQtCore.so.4 0xb74354fe

11 ?? /usr/lib/qt4/lib/libQtCore.so.4 0xb7466c88

12 g_main_dispatch gmain.c 3054 0xb6a7ec93

13 g_main_context_dispatch gmain.c 3630 0xb6a7ec93

14 g_main_context_iterate gmain.c 3701 0xb6a7f030

15 g_main_context_iteration gmain.c 3762 0xb6a7f111

16 QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) /usr/lib/qt4/lib/libQtCore.so.4 0xb74674ef

17 QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) /usr/lib/qt4/lib/libQtCore.so.4 0xb7433fdc

18 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) /usr/lib/qt4/lib/libQtCore.so.4 0xb74342d1

19 QCoreApplication::exec() /usr/lib/qt4/lib/libQtCore.so.4 0xb74396ba

20 main main.cpp 95 0x8055d2b

... <更多>

这就是前因后果

解决方法就是删除 libqxt0.7.0遗留下来的共享库 ,重新安装一下libqxt0.6.2

遇到其它开源库的类似问题时,可类推。

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4