链接为Android构建的openssl库时出现不满意的链接器错误

链接为Android构建的openssl库时出现不满意的链接器错误,ssl,android-ndk,openssl,Ssl,Android Ndk,Openssl,我在使用Android本机代码链接openssl LIB(ssl/crypto)时遇到以下错误。我使用opensslv1.0.2l代码,并使用androidsdk/ndk bundle目录下的ndk build构建了它 错误信息 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.pkg-name.client, PID: 26925 java.lang.UnsatisfiedLinkError: **dlopen failed: canno

我在使用Android本机代码链接openssl LIB(ssl/crypto)时遇到以下错误。我使用opensslv1.0.2l代码,并使用androidsdk/ndk bundle目录下的ndk build构建了它

错误信息

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pkg-name.client, PID: 26925
java.lang.UnsatisfiedLinkError: **dlopen failed: cannot locate symbol "i2d_DHxparams"** referenced by "/data/app/com.pkg-name.client-1/lib/arm/libnative-lib.so"...
我的android-config.make文件包含以下内容:

#
# These flags represent the build-time configuration of openssl for android
#
# They were pruned from the "Makefile" generated by running ./Configure from import_openssl.sh
#

# From CLFAG=   
LOCAL_CFLAGS += -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -O3 -fomit-frame-pointer -Wall #-DTERMIO

# From DEPFLAG=
LOCAL_CFLAGS += -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_SCTP \
                -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_CAST -DOPENSSL_NO_CMS -DOPENSSL_NO_GMP -DOPENSSL_NO_IDEA -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_SHA0 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SEED -DOPENSSL_NO_STORE -DOPENSSL_NO_WHIRLPOOL

#Copied by seaching for the OPENSSL_NO_
#LOCAL_CFLAGS += -DOPENSSL_NO_DEPRECATED

# Extra
LOCAL_CFLAGS += -DOPENSSL_NO_HW -DOPENSSL_NO_ENGINE -DZLIB

# Debug
# LOCAL_CFLAGS += -DCIPHER_DEBUG
如果我需要启用任何标志,请告诉我。 我尝试了针对Android的预构建openssl库,但也遇到了类似的问题

i2d\u DHxparams
是OpenSSL 1.1.0中的宏,而不是1.0.2:

$ cd openssl
$ grep -IR i2d_DHxparams
crypto.map:        i2d_DHxparams;
util/libcrypto.num:i2d_DHxparams                           2206 1_1_0   EXIST::FUNCTION:DH
doc/man3/d2i_X509.pod:i2d_DHxparams,
include/openssl/dh.h:# define i2d_DHxparams_fp(fp,x) \
include/openssl/dh.h:    ASN1_i2d_fp(i2d_DHxparams,(fp), (unsigned char *)(x))
include/openssl/dh.h:# define i2d_DHxparams_bio(bp,x) \
include/openssl/dh.h:    ASN1_i2d_bio_of_const(DH, i2d_DHxparams, bp, x)
include/openssl/dh.h:int i2d_DHxparams(const DH *a, unsigned char **pp);
crypto/dh/dh_ameth.c:        return i2d_DHxparams(a, pp);
crypto/dh/dh_asn1.c:int i2d_DHxparams(const DH *dh, unsigned char **pp)
apps/dhparam.c:                i = i2d_DHxparams_bio(out, dh);
听起来您可能使用了错误的标题或库。也许你在路径上有1.1.0的头文件,并且它们在Android头文件之前被拾取


编辑:该符号似乎也出现在OpenSSL 1.0.2中:

$ git checkout OpenSSL_1_0_2-stable
$ grep -IR i2d_DHxparams
crypto.map:        i2d_DHxparams;
util/libeay.num:i2d_DHxparams                           4683    EXIST::FUNCTION:DH
crypto/dh/dh.h:# define i2d_DHxparams_fp(fp,x) \
crypto/dh/dh.h:    ASN1_i2d_fp(i2d_DHxparams,(fp), (unsigned char *)(x))
crypto/dh/dh.h:# define i2d_DHxparams_bio(bp,x) \
crypto/dh/dh.h:    ASN1_i2d_bio_of_const(DH, i2d_DHxparams, bp, x)
crypto/dh/dh.h:int i2d_DHxparams(const DH *a, unsigned char **pp);
crypto/dh/dh_ameth.c:        return i2d_DHxparams(a, pp);
crypto/dh/dh_asn1.c:int i2d_DHxparams(const DH *dh, unsigned char **pp)
apps/dhparam.c:                i = i2d_DHxparams_bio(out, dh);
但在1.0.1中似乎没有出现:

$ grep -IR i2d_DHxparams
crypto.map:        i2d_DHxparams;
i2d\u DHxparams
是OpenSSL 1.1.0中的宏,而不是1.0.2:

$ cd openssl
$ grep -IR i2d_DHxparams
crypto.map:        i2d_DHxparams;
util/libcrypto.num:i2d_DHxparams                           2206 1_1_0   EXIST::FUNCTION:DH
doc/man3/d2i_X509.pod:i2d_DHxparams,
include/openssl/dh.h:# define i2d_DHxparams_fp(fp,x) \
include/openssl/dh.h:    ASN1_i2d_fp(i2d_DHxparams,(fp), (unsigned char *)(x))
include/openssl/dh.h:# define i2d_DHxparams_bio(bp,x) \
include/openssl/dh.h:    ASN1_i2d_bio_of_const(DH, i2d_DHxparams, bp, x)
include/openssl/dh.h:int i2d_DHxparams(const DH *a, unsigned char **pp);
crypto/dh/dh_ameth.c:        return i2d_DHxparams(a, pp);
crypto/dh/dh_asn1.c:int i2d_DHxparams(const DH *dh, unsigned char **pp)
apps/dhparam.c:                i = i2d_DHxparams_bio(out, dh);
听起来您可能使用了错误的标题或库。也许你在路径上有1.1.0的头文件,并且它们在Android头文件之前被拾取


编辑:该符号似乎也出现在OpenSSL 1.0.2中:

$ git checkout OpenSSL_1_0_2-stable
$ grep -IR i2d_DHxparams
crypto.map:        i2d_DHxparams;
util/libeay.num:i2d_DHxparams                           4683    EXIST::FUNCTION:DH
crypto/dh/dh.h:# define i2d_DHxparams_fp(fp,x) \
crypto/dh/dh.h:    ASN1_i2d_fp(i2d_DHxparams,(fp), (unsigned char *)(x))
crypto/dh/dh.h:# define i2d_DHxparams_bio(bp,x) \
crypto/dh/dh.h:    ASN1_i2d_bio_of_const(DH, i2d_DHxparams, bp, x)
crypto/dh/dh.h:int i2d_DHxparams(const DH *a, unsigned char **pp);
crypto/dh/dh_ameth.c:        return i2d_DHxparams(a, pp);
crypto/dh/dh_asn1.c:int i2d_DHxparams(const DH *dh, unsigned char **pp)
apps/dhparam.c:                i = i2d_DHxparams_bio(out, dh);
但在1.0.1中似乎没有出现:

$ grep -IR i2d_DHxparams
crypto.map:        i2d_DHxparams;

@user3391612-我检查了1.0.2分支,以及其中的符号。我不知道该怎么办。找到OpenSSL的
libcrypto.so
并在其上运行
strings
,以转储OpenSSL版本。例如,
strings libcrypto.so | egrep-I'OpenSSL | version'
。听起来头和库不匹配。让我们ping Matt Caswell,他是OpenSSL开发人员之一。我在代码中使用了OpenSSL v1.0.2l头文件。opensslv.h定义了以下宏定义OPENSSL\u版本号0x100020cfL我遇到另一台设备的另一个linkerr问题。09-28 13:23:52.905 29981-29981/com.pkg-name.client E/art:dlopen(“/data/app/com.pkg name.client/lib/arm/libnative lib.so”,RTLD_LAZY)失败:dlopen失败:找不到“libnative lib.so”引用的符号“EC_curve_nist2nid”…我在libcryto.a上运行了strings命令,发现该版本是“OpenSSL 1.0.2l的一部分,2017年5月25日”回答ping,但不确定我能为上述讨论添加多少内容。这个符号在1.0.2中绝对存在,但我不熟悉Android的构建,所以我无法提出问题所在。@MattCaswell-你知道谷歌对他们的端口做了什么特别的事情吗?也许将一些
#定义
转换成弱符号?@user3391612-我查看了1.0.2分支,以及其中的符号。我不知道该怎么办。找到OpenSSL的
libcrypto.so
并在其上运行
strings
,以转储OpenSSL版本。例如,
strings libcrypto.so | egrep-I'OpenSSL | version'
。听起来头和库不匹配。让我们ping Matt Caswell,他是OpenSSL开发人员之一。我在代码中使用了OpenSSL v1.0.2l头文件。opensslv.h定义了以下宏定义OPENSSL\u版本号0x100020cfL我遇到另一台设备的另一个linkerr问题。09-28 13:23:52.905 29981-29981/com.pkg-name.client E/art:dlopen(“/data/app/com.pkg name.client/lib/arm/libnative lib.so”,RTLD_LAZY)失败:dlopen失败:找不到“libnative lib.so”引用的符号“EC_curve_nist2nid”…我在libcryto.a上运行了strings命令,发现该版本是“OpenSSL 1.0.2l的一部分,2017年5月25日”回答ping,但不确定我能为上述讨论添加多少内容。这个符号在1.0.2中绝对存在,但我不熟悉Android的构建,所以我无法提出问题所在。@MattCaswell-你知道谷歌对他们的端口做了什么特别的事情吗?也许将一些
#定义
转换成弱符号?