ld пропускает общую библиотеку - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь развернуть приложение Qt, предоставив библиотеки Qt в качестве разделяемых библиотек в каталоге и указав на них ld, используя LD_LIBRARY_PATH.Это работает для всех библиотек 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 голосов
/ 14 декабря 2018

другой ответ правильный.На случай, если ссылка там не работает, вот что произошло в моем случае и как я это исправил.

Я работал на более старом ядре версии 3.10 в системе, где был установлен Qt5.Одна из библиотек, а именно libQt5Core.so.5.11.0, имеет раздел ELF .note.ABI-tag, который указывает, что библиотека была скомпилирована для ядра 3.17.0.Присутствие этого раздела можно увидеть, например, через

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

И тот факт, что он скомпилирован для более нового ядра, раскрывается с помощью file с заметным замечанием "для 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

, который удалил этот раздел и позволил библиотеке загружаться.

Однако будьте осторожны: если вы сделаете это, вы явно нарушите допущения, которые могла использовать система сборки библиотек, так что все может сломаться.В моем случае, они этого не сделали.

0 голосов
/ 18 мая 2018

Решение здесь: https://github.com/Microsoft/WSL/issues/3023

Библиотека содержит заметку ABI, которую можно удалить с помощью strip, чтобы ld принял библиотеку.

...