2

我在 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 系统调用除外,这些调用需要在外部处理)。

感谢您的任何解释!

4

3 回答 3

1

您使用的库之一是dlopening libXfixes。这几天很流行。您可以

  1. 跟踪它,用常规函数调用替换dlopening/ ing,并链接到静态版本的.dlsymlibXfixes
  2. 动态链接您的程序,确保其运行时库搜索路径包含您自己的目录,例如/opt/yourappname/lib,并将您的所有.sos 放在该目录中。或者,如果您希望用户能够在任何地方安装,请使用设置LD_LIBRARY_PATH.

断言失败可能与也可能无关libXfixes,您可以通过复制libXfixes.so到目标机器快速检查。

于 2013-06-21T20:59:43.973 回答
1

我似乎遇到了同样的问题,并找到了最酷的破解方法!问题是它只是试图加载 libXcursor.so.1,最终将 libX11 和所有朋友也拖进来。

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

于 2013-06-21T02:15:33.323 回答
0

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

在运行时加载模块是正常的——比如加载插件或驱动程序时。而且由于模块动态链接到 X11 本身,你会发现自己一团糟。

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

于 2010-07-17T03:33:24.410 回答