Приложение не может найти 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. См. Некоторые из этих ссылок:

Похоже, что решение состоит в том, чтобы убедиться, что у вас установлены и 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 потому что те держат сильные крипто-шифры... вы знаете, эти комические законы об экспорте.

Другие вопросы по тегам