ld跳过共享库

时间:2018-05-18 15:54:19

标签: qt shared-libraries ld

我试图通过在目录中提供Qt库作为共享库并使用LD_LIBRARY_PATH将ld指向它们来部署Qt应用程序。这适用于所有Qt库,例如libQt5Network或libQt5Gui,但不适用于以某种方式找不到的libQt5Core,而是使用系统版本。

使用LD_DEBUG =所有我可以看到ld尝试存在的文件,但跳过它

  3705: file=libQt5Core.so.5 [0];  needed by ./app.bin [0]
  3705: find library=libQt5Core.so.5 [0]; searching
  3705:  search path=/home/user/app/lib:/usr/lib64/tls/x86_64/x86_64:/usr/lib64/tls/x86_64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64/x86_64:/usr/lib64/x86_64:/usr/lib64/x86_64:/usr/lib64     (LD_LIBRARY_PATH)
  3705:   trying file=/home/user/app/lib/libQt5Core.so.5 <- this file exists
  3705:   trying file=/usr/lib64/tls/x86_64/x86_64/libQt5Core.so.5
  3705:   trying file=/usr/lib64/tls/x86_64/libQt5Core.so.5
  3705:   trying file=/usr/lib64/tls/x86_64/libQt5Core.so.5
  3705:   trying file=/usr/lib64/tls/libQt5Core.so.5
  3705:   trying file=/usr/lib64/x86_64/x86_64/libQt5Core.so.5
  3705:   trying file=/usr/lib64/x86_64/libQt5Core.so.5
  3705:   trying file=/usr/lib64/x86_64/libQt5Core.so.5
  3705:   trying file=/usr/lib64/libQt5Core.so.5

libQt5Core.so.5和app.bin都是64位精灵。

有没有办法找出ld拒绝文件的原因?

2 个答案:

答案 0 :(得分:1)

解决方案在这里:https://github.com/Microsoft/WSL/issues/3023

该库包含一个ABI注释,可以使用strip删除它以使ld接受该库。

答案 1 :(得分:0)

other answer是正确的。以防万一那里的链接断开了,这是我的情况以及修复方法。

我在安装Qt5的系统上运行版本3.10的旧内核。其中一个库– libQt5Core.so.5.11.0具有ELF节.note.ABI-tag,该节指定该库是针对内核3.17.0编译的。可以通过例如

查看该部分的存在
objdump -sj .note.ABI-tag /path/to/library.so

file揭示了它是为较新的内核编译的事实,在输出末尾附近很难注意到“ for GNU / Linux 3.17.0”。就我而言,是:

/opt/qt511/lib/libQt5Core.so.5.11.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.17.0, BuildID[sha1]=df5f7e933899d1ff629145ab7ca35b2f9bc41843, stripped

所以我的解决方法是运行

strip --remove-section=.note.ABI-tag /path/to/library.so

删除了此部分并允许加载库。

但是请注意,如果执行此操作,则会明确破坏库构建系统可能使用的假设,因此可能会破坏。就我而言,他们没有。