2011-10-22 60 views
0

二元已经用gcc使用被链接:'GCC -lXext' 成功,但libXext似乎没有关联

gcc notion.o -Wl,-whole-archive ../ioncore/ioncore.a -Wl,-no-whole-archive -L/usr/X11R6/lib -lX11 -lXext -lSM -lICE -Wl,-whole-archive -L../libmainloop -lmainloop -lextl -ltu -Wl,-no-whole-archive pkg-config --libs lua5.1 -ldl -lm -lrt -Xlinker --export动态-o概念

链接成功 - 但是,当启动应用程序时,由于未定义符号(XShapeCombineRectangles),用户报告崩溃。 XShapeCombineRectangles应该在libXext中可用。

事实上,随着“LDD”检查,Xext不被列为该用户的共享库的依赖:

 
linux-gate.so.1 => (0x0068f000) 
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0x00ec7000) 
liblua5.1.so.0 => /usr/lib/i386-linux-gnu/liblua5.1.so.0 
(0x00226000) 
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x005da000) 
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x005e1000) 
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x0032c000) 
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00335000) 
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0x007d6000) 
/lib/ld-linux.so.2 (0x00882000) 
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 
(0x006dc000) 
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0x00110000) 
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 
(0x00dd8000) 

当我编译应用程序自己所示,LDD 确实显示libXext,确实不崩溃。

这里可能会发生什么?

(更多背景:这个错误报道在http://sourceforge.net/tracker/?func=detail&aid=3427206&group_id=314802&atid=1324528

+0

你确定你没有链接到一个静态libXext库,而不是共享库吗? – nos

+0

我不完全确定,但用'-Wl,-y,XShapeCombineRectangles'运行会显示'/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386- linux-gnu/libXext.so',所以我会说它是动态链接的,对吧? –

回答

2

这可能是因为你的连接(或GCC)自动地增加--as-needed在幕后,你的系统上XShapeCombineRectangles来自一些库其他比libXext 。

您可以在链接中找到哪个库定义了XShapeCombineRectangles符号:只需将-Wl,-y,XShapeCombineRectangles添加到您的链接线。

添加-v将显示是否有任何--as-needed参数在播放或不播放。

您可以通过将-Wl,--no-as-needed,-lXext附加到链接行来强制执行最终可执行文件以引用libXext

更新:我误解了这个问题(而且你已经制定了非常差的问题)。

要重申:

  1. 的应用程序链接,并正确地作用于有机磷农药体系,ldd
    app
    显示了libXext
  2. 应用还链接依赖和最终用户的系统上正确启动,但ldd app确实显示libXext
  3. 当应用程序试图dlopen("de.so", ...)终端用户系统上,这个失败,​​

如果以上几点是正确的,很可能是

  1. 终端用户系统具有libXext.a,但不libXext.so
  2. 主要应用不叫XShapeCombineRectangles,只有在de.so代码做
  3. de.so链接,没有-lXext链接线。

要么安装libXext.so,要么将主应用程序链接到-u XShapeCombineRectangles可能会解决问题。

要了解问题,您可能需要阅读this

我的猜测是,XShapeCombineRectangles没有从主可执行文件引用,因此无法从libXext.a“书架”,因此无法从主可执行出口尽管--export-dynamic拉。

+0

嗯,'nm /usr/lib/i386-linux-gnu/libXext.a | grep XShapeCombineRectangles'实际上在'libXext'中出现了'XShapeCombineRectangles' - 但我会通过它,谢谢! –

+0

因为他说在他的系统上,libXext *被列出,我怀疑在他的系统中,主要应用程序由于某种原因取决于libXext的函数,因此根据需要链接它。对于其他用户系统,主可执行文件可能不依赖于libXext,因此不会链接到它(因此可能需要像您说的那样不需要)。也许在破解.so文件(没有列出libXext为DT_NEEDED)的应用程序中出现dlopen会导致崩溃? –

+0

您重申的问题是正确的,谢谢。 1)运行'-Wl,-y,XShapeCombineRectangles'以'/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/libXext结尾。所以: XShapeCombineRectangles'的定义,所以这似乎不是这种情况。 2)的确如此(好,'de.so'和'mod_dock.so')。 3)的确如此(de.so是由'gcc -shared -lrt init.o draw.o font.o colour.o brush.o fontset.o style.o precompose.o exports.o -o de .so')。 –