应用程序找不到用于编译库的OpenSSL

时间:2013-09-30 10:57:37

标签: java c openssl solaris solaris-10

我有一个应用程序,它使用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并没有用。

修改

@ nudzo和Kenster

好的,不要试着把它挤进你的答案的评论栏,我想除了我的问题之外我还会发布它以提高可读性。

所以我检查了我的系统,我只能找到两份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

同样,在编译时,遗漏标题的路径会引发EVP类型的implicit declaration of function错误。但是,这仍然会导致与最初发布的错误相同的错误。

因此,如果系统上只有这两个副本,则表明系统默认使用的是/usr/sfw副本,而不是使用Solaris附带的版本(/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 个答案:

答案 0 :(得分:1)

如果链接器未能找到共享库,则会出现不同的错误。您的问题是链接器正在查找它认为应该的所有库,但它没有找到EVP_aes_256_cbc的符号。

在Solaris 10上似乎存在此符号的问题。请参阅以下链接:

解决方案似乎是确保安装了SUNWcry和SUNWcryr,如果你使用这些软件包进行加密的话。并查找名为libcrypto_extra.so或libssl_extra.so的库,并在链接时包含该文件。

答案 1 :(得分:0)

我认为你的链接时间和运行时OpenSSL是不同的。 Solaris在/usr/sfw中有OpenSSL,我建议你使用那个。特别是当您使用Solaris捆绑的gcc时。另一个很好的理由是,这个OpenSSL具有PKCS11加密引擎,您可以绑定到Solaris PKCS11令牌,然后您可以使用全功能的硬件加密加速器。运行cryptoadm list -mv以获得您的硬件功能。

要正确链接,请添加-L/usr/sfw/lib -R/usr/sfw/lib,如上所述,还要添加libcrypto_extra.solibssl_extra.so因为这些包含强大的加密密码......您知道,这些漫画出口法律。