我有一个应用程序,它使用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,...
我为大量的额外信息道歉。
答案 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.so
,libssl_extra.so
因为这些包含强大的加密密码......您知道,这些漫画出口法律。