代码之家  ›  专栏  ›  技术社区  ›  DJohnson

ld跳过共享库

  •  1
  • DJohnson  · 技术社区  · 6 年前

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

    使用LD_DEBUG=all我可以看到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。所以5和应用程序。bin是64位elf。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   DJohnson    6 年前

    解决方案如下: https://github.com/Microsoft/WSL/issues/3023

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

        2
  •  1
  •   Ruslan PiotrNycz    6 年前

    这个 other answer 这是正确的。以防链接被破坏,下面是我的情况以及我是如何修复的。

    我在安装了Qt5的系统上运行了一个较旧的内核,版本3.10。其中一个图书馆, libQt5Core.so.5.11.0 ,有一个精灵区 .note.ABI-tag ,它指定该库是为内核3.17.0编译的。可通过以下方式查看该部分的存在:。

    objdump -sj .note.ABI-tag /path/to/library.so
    

    它是为更新的内核编译的,这一事实由 file 很难注意到的是,“for GNU/Linux3.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
    

    它删除了这个部分,并允许库加载。

    但要注意,如果这样做,就会明显打破库构建系统可能使用的假设,因此可能会出现问题。但就我而言,他们没有。