LINUX.ORG.RU

Каких еще символов ему не хватает?

 ,


0

1

Мне досталась некая негодная программа, которая распространяется в бинарном виде и носит с собой все необходимые библиотеки. Соответственно, есть каталог, где все это свалено в одну кучу, и он, конечно, прописан в LD_LIBRARY_PATH:

$ ls -1
libQt5Core.so.5
libQt5DBus.so.5
libQt5Gui.so.5
libQt5Network.so.5
libQt5WebSockets.so.5
libQt5Widgets.so.5
libQt5XcbQpa.so.5
libQt5Xml.so.5
libcrypto.so.1.0.0
libcurl.so.4
libssl.so.1.0.0
libz.so.1
...
executable
plugins

При запуске executable в виртуалке с Ubuntu-22.04 я получаю список ошибок вида:

qt.network.ssl: QSslSocket: cannot resolve CRYPTO_num_locks
...
qt.network.ssl: QSslSocket: cannot resolve SSL_library_init
...

Все эти функции есть в libcrypto.so.1.0.0 и libssl.so.1.0.0, но сами libcrypto и libssl не фигурируют в выводе ldd ни для executable, ни для прочих бинарников. Более того, я не вижу этих недостающих символов в выводе nm -uD и objdump -T.

Эта же самая программа нормально запускается в контейнере podman с точно такой же убунтой.

Как понять что вообще здесь происходит?

Все эти функции есть в libcrypto.so.1.0.0 и libssl.so.1.0.0, но сами libcrypto и libssl не фигурируют в выводе ldd ни для executable, ни для прочих бинарников. Более того, я не вижу этих недостающих символов в выводе nm -uD и objdump -T.

В этом нет ничего сверхъестественного - эти библиотеки загружаются динамически через dlopen, поэтому их следов нет ни в ELF-заголовках NEEDED (т.е. ldd и objdump -p бесполезны), ни в таблицах символов (nm, objdump -T).

А сделано так потому, что из-за лицензии OpenSSL есть проблемы с ее распространением, и в норме она должна загружаться из системы.

Нужно посмотреть, какие версии OpenSSL поддерживает использованная версия Qt, и доустановить в систему.

annulen ★★★★★
()
Ответ на: комментарий от aol

Ага, вижу что в виртуалке оно пытается искать libssl.so и промахивается мимо своей версии,

openat(AT_FDCWD, "/home/<...>/libssl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/<...>/libssl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libssl.so", O_RDONLY|O_CLOEXEC) = 11

а в контейнере запускается без этого.

Zeta_Gundam
() автор топика