为什么静态X11应用程序在其他计算机上失败?

时间:2010-07-17 00:29:58

标签: x11 static-linking

我在32位Fedora Core 9机器上静态构建了X11R5库。然后我构建了一个使用X11并静态链接的应用程序。到现在为止还挺好。 ldd报告它是一个静态链接的应用程序。我可以在本地运行它就好了。但是当我将它复制到64位FC9机器时,它失败如下:

assistant.static:xcb_io.c:228:_XSend:断言`!dpy-> xcb-> request_extra'失败。
中止

当我运行strace时,它似乎试图打开libXfixes.so:

...
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libXfixes.so", O_RDONLY)     = -1 ENOENT (No such file or directory)
open("/usr/lib/libXfixes.so", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xf7bf9000, 123447)              = 0
open("libXfixes", O_RDONLY)             = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 8
fstat64(0x8, 0xff86a9e8)                = 0
mmap2(NULL, 123447, PROT_READ, MAP_PRIVATE, 8, 0) = 0xfffffffff7bf9000
close(8)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libXfixes", O_RDONLY)        = -1 ENOENT (No such file or directory)
open("/usr/lib/libXfixes", O_RDONLY)    = -1 ENOENT (No such file or directory)
munmap(0xf7bf9000, 123447)              = 0
open("libXfixes.so.4", O_RDONLY)        = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 8
fstat64(0x8, 0xff86a9e8)                = 0
mmap2(NULL, 123447, PROT_READ, MAP_PRIVATE, 8, 0) = 0xfffffffff7bf9000
close(8)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libXfixes.so.4", O_RDONLY)   = -1 ENOENT (No such file or directory)
open("/usr/lib/libXfixes.so.4", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xf7bf9000, 123447)              = 0
open("libXfixes", O_RDONLY)             = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 8
fstat64(0x8, 0xff86a9e8)                = 0
mmap2(NULL, 123447, PROT_READ, MAP_PRIVATE, 8, 0) = 0xfffffffff7bf9000
close(8)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libXfixes", O_RDONLY)        = -1 ENOENT (No such file or directory)
open("/usr/lib/libXfixes", O_RDONLY)    = -1 ENOENT (No such file or directory)
munmap(0xf7bf9000, 123447)              = 0
write(2, "assistant.static: xcb_io.c:228: "..., 85assistant.static: xcb_io.c:228: _XSend: Assertion `!dpy->xcb->request_extra' failed.

我不明白为什么静态链接的应用程序会尝试打开共享的X库。不应该通过静态链接包含运行应用程序所需的所有内容(当然除了应用程序所做的任何Linux系统调用,需要在外部处理)。

感谢您的解释!

3 个答案:

答案 0 :(得分:0)

X11动态加载库,它可能正在加载64位库而不是32位版本。

在运行时加载模块是正常的 - 比如加载插件或驱动程序时。而且由于这些模块与X11本身动态链接,你会发现自己陷入了混乱。

就个人而言,我从来没有幸运地将X11静态连接 - 真的需要你吗?

答案 1 :(得分:0)

我似乎遇到了同样的问题,发现了最酷的黑客!问题是它只是尝试加载libXcursor.so.1,最终拖动libX11&所有的朋友也都在。

我的解决方案:编辑EXE并将libXcursor.so.1或libXfixes.so重命名为libREMOVED.so或具有相同#字母的内容。然后它将跳过加载那些可选扩展。

答案 2 :(得分:0)

您使用的其中一个库是dlopen libXfixes。这些日子很受欢迎。你可以

  1. 追踪它,用常规函数调用替换dlopen / dlsym,并链接到libXfixes的静态版本。
  2. 动态链接您的程序,确保其运行时库搜索路径包含您自己的目录,例如: /opt/yourappname/lib,并将所有.so放在该目录中。或者,如果您希望用户能够在任何地方安装,请使用设置LD_LIBRARY_PATH的启动shell脚本。
  3. 断言失败可能与libXfixes有关,也可能与libXfixes.so无关,您可以通过将{{1}}复制到目标计算机来快速检查。