Приложение не может найти OpenSSL, используемый для компиляции библиотеки
У меня есть приложение, которое использует JNI для вызова файла C, который читает некоторую системную информацию. У меня это работает нормально в Linux, но в Solaris 10 (SPARC, 32-разрядная версия) у меня возникают проблемы при использовании библиотеки. Я скомпилировал файл C на той же машине, на которой тестирую, с помощью команды:
gcc -O2 -fPIC -shared -static-libgcc -I/usr/local/ssl/include \
-I$JAVA_HOME/include -I$JAVA_HOME/include/solaris -lcrypto \
-lm -std=c99 -o libosaccess.so osaccess.c
Это хорошо компилируется, но в отличие от Linux, мне пришлось указать путь к системе OpenSSL, -I/usr/local/ssl/include
, Это, очевидно, проблема, так как при использовании библиотеки я получаю следующую фатальную ошибку из-за типа OpenSSL:
ld.so.1: java: fatal: relocation error: file /workspace/solaris_sparc/libosaccess.so: symbol EVP_aes_256_cbc: referenced symbol not found
Killed
Я попытался добавить местоположение системы OpenSSL в PATH
а также мой LD_LIBRARY_PATH
, но продолжаю получать ошибку. Я прочитал, что вижу пути, которые ищет мое приложение, используя ldd -d
но пока не могу заставить это работать.
Может кто-нибудь сказать мне, если есть способ, которым я могу установить, где файлы OpenSSL, чтобы все приложения могли найти их? На моей машине с Linux нет переменных окружения, в которых указан путь к OpenSSL. Однако есть бинарный файл openssl
под /usr/bin
, который входит в PATH
переменная. Я нашел бинарный файл на Solaris, но добавил его в PATH
не помогает
РЕДАКТИРОВАТЬ
@ Нудзо и Кенстер
Итак, вместо того, чтобы пытаться втиснуть это в поле для комментариев для ваших ответов, я подумал, что добавлю это в дополнение к моему вопросу, чтобы улучшить читабельность.
Итак, я проверил свою систему и могу найти только две копии OpenSSL.
- Делать
pkginfo | grep 'SUNWcry*'
показывает, что у меня установлены два дополнительных пакета. - Только
/usr/sfw
В локации есть две "дополнительные" библиотеки, которые вы упомянули - Оба места имеют
evp.h
заголовочный файл, который включает в себяEVP_aes_256_cbc
условное обозначение.
Места:
/ USR / SFW
xxx-1035> find /usr/sfw -type f -name 'openssl'
/usr/sfw/bin/openssl
xxx-1036> find /usr/sfw -type f -name 'evp.h'
/usr/sfw/include/openssl/evp.h
xxx-1037> find /usr/sfw -type f -name 'libcrypto*'
/usr/sfw/lib/sparcv9/libcrypto.so.0.9.7
/usr/sfw/lib/sparcv9/libcrypto_extra.so.0.9.7
/usr/sfw/lib/libcrypto.so.0.9.7
/usr/sfw/lib/libcrypto_extra.so.0.9.7
xxx-1038> find /usr/sfw -type f -name 'libssl*'
/usr/sfw/lib/sparcv9/libssl.so.0.9.7
/usr/sfw/lib/sparcv9/libssl_extra.so.0.9.7
/usr/sfw/lib/libssl.so.0.9.7
/usr/sfw/lib/libssl_extra.so.0.9.7
/ USR / местные / SSL
xxx-1040> find /usr/local/ssl -type f -name 'openssl'
/usr/local/ssl/bin/openssl
xxx-1041> find /usr/local/ssl -type f -name 'evp.h'
/usr/local/ssl/include/openssl/evp.h
xxx-1042> find /usr/local/ssl -type f -name 'libcrypto*'
/usr/local/ssl/lib/libcrypto.a
/usr/local/ssl/lib/libcrypto.so.0.9.7
/usr/local/ssl/lib/libcrypto.so.0.9.8
/usr/local/ssl/lib/pkgconfig/libcrypto.pc
xxx-1043> find /usr/local/ssl -type f -name 'libssl*'
/usr/local/ssl/lib/libssl.a
/usr/local/ssl/lib/libssl.so.0.9.7
/usr/local/ssl/lib/libssl.so.0.9.8
/usr/local/ssl/lib/pkgconfig/libssl.pc
Я перекомпилировал мой файл C, используя:
gcc -O2 -fPIC -shared -static-libgcc \
-I$JAVA_HOME/include -I$JAVA_HOME/include/solaris \
-I/usr/sfw/include -L/usr/sfw/lib -R/usr/sfw/lib \
-lcrypto -lm -std=c99 -o libosaccess.so osaccess.c
Опять же, пропуск пути к броскам заголовков implicit declaration of function
ошибки типов EVP при компиляции. Это, однако, все еще вызывает ту же ошибку, что и первоначально опубликовано.
Поэтому, если в системе есть только эти две копии, это будет означать, что вместо использования версии, поставляемой с Solaris (/usr/sfw
), система по умолчанию использует /usr/local
копия, которая не имеет дополнительных "дополнительных" общих объектов. Будет ли это справедливым предположением? Как бы я окончательно проверил это? У меня нет прав, чтобы удалить любую копию.
Кроме того, работает cryptoadm list -mv
Вывести много информации я не совсем понял. Однако я нашел эти записи в паре таблиц слотов:
CKM_AES_CBC 16 32 . X X . . . . . . . X X . .
а также:
Kernel software providers:
==========================
aes256: CKM_AES_ECB,CKM_AES_CBC,CKM_AES_CTR
Kernel hardware providers:
==========================
n2cp/0: CKM_DES_CBC,...,CKM_AES_CBC,...
Я прошу прощения за огромное количество дополнительной информации.
2 ответа
Если компоновщик не может найти общую библиотеку, он выдаст вам другую ошибку. Ваша проблема в том, что компоновщик находит все библиотеки, которые, как он считает, должен, но он не находит символ для EVP_aes_256_cbc
,
Кажется, есть проблема с этим символом в Solaris 10. См. Некоторые из этих ссылок:
- http://fixunix.com/ssh/73273-openssh-solaris-10-amd64.html
- https://forums.proftpd.org/smf/index.php?topic=3782.0
- http://marc.info/?l=libssh2-devel&m=121642790624715
- https://groups.google.com/forum/
- http://trac.libssh2.org/ticket/46
Похоже, что решение состоит в том, чтобы убедиться, что у вас установлены и SUNWcry, и SUNWcryr, если вы используете эти пакеты для шифрования. И найдите библиотеку с именем libcrypto_extra.so или libssl_extra.so и включите ее при компоновке.
Я думаю, что ваше время ссылки и время выполнения OpenSSL различны. В Solaris есть OpenSSL в /usr/sfw
и я рекомендую вам использовать именно этот. Особенно, когда вы используете Solaris в комплекте gcc
, Другая веская причина в том, что этот OpenSSL имеет криптографический движок PKCS11, который можно привязать к токену Solaris PKCS11, а затем использовать всю мощь аппаратных криптоускорителей. Бежать cryptoadm list -mv
чтобы получить ваши аппаратные возможности.
Чтобы это правильно добавить ссылку -L/usr/sfw/lib -R/usr/sfw/lib
и, как упоминалось выше, также добавить libcrypto_extra.so
, libssl_extra.so
потому что те держат сильные крипто-шифры... вы знаете, эти комические законы об экспорте.