3

案子:

我正在构建一个使用libcrypto和的应用程序libssl。我正在尝试使用预构建libcrypto.solibssl.so编译我的应用程序。

但我不断收到未定义的参考错误。

我的应用程序/Android.mk

LOCAL_PATH := $(call my-dir)
my_LOCAL_PATH := $(LOCAL_PATH)
include $(call all-subdir-makefiles)
LOCAL_PATH := $(my_LOCAL_PATH)
common_SRC_FILES := \
    src/foo.c
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(common_SRC_FILES)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../openssl/include
LOCAL_SHARED_LIBRARIES += mylibssl mylibcrypto
include $(BUILD_STATIC_LIBRARY)

我的应用程序/mylibssl/Android.mk

构建 mylibssl [来自预构建的 libssl.so]

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibssl
LOCAL_SRC_FILES := libssl.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../openssl/include
include $(BUILD_PREBUILT)

我的应用程序/mylibcrypto/Android.mk

构建 mylibcrypto [来自预构建的 libcrypto.so]

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibcrypto
LOCAL_SRC_FILES := libcrypto.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../openssl/include
include $(BUILD_PREBUILT)

我不断得到

error: undefined reference to 'BIO_new_mem_buf'
error: undefined reference to 'PEM_read_bio_X509_AUX'
error: undefined reference to 'BIO_free'
...

我花了几个小时试图弄清楚并且完全被卡住了。请帮忙!

4

1 回答 1

0

我正在构建一个使用 libcrypto 和 libssl 的应用程序......但我不断收到未定义的参考错误。

error: undefined reference to 'BIO_new_mem_buf'
error: undefined reference to 'PEM_read_bio_X509_AUX'
error: undefined reference to 'BIO_free'

这些是链接器错误,意味着您没有链接到 OpenSSL 库。它可能是一个路径问题,假设您有可用的 OpenSSL 库的 Android 版本。


如果您需要 Android 版本的 OpenSSL 库,您可以自己构建或在 Github 上找到它。要自己构建它,请参阅FIPS 库和 Android(忽略 FIPS 内容)。所需的步骤是(并在运行脚本时注意前导点“。”):

cd openssl-1.0.1f/
wget http://wiki.openssl.org/images/7/70/Setenv-android.sh
chmod a+x *.sh
. ./setenv-android.sh

./config shared no-ssl2 no-hw no-engine --openssldir=/usr/local/ssl/android-18/ <other options>
make depend
make all

对于选项二,您可以使用https://www.google.com/q=openssl+android+site:github.com搜索 Github 。


Building mylibcrypto [from a prebuilt libcrypto.so]

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibcrypto
LOCAL_SRC_FILES := libcrypto.so

这不会产生预期的结果,如果你让它工作,可能会导致崩溃。问题是 Android 使用 0.9.8,而您可能正在构建 1.0.1。

发生的情况是 Zygote 在启动时加载 OpenSSL 0.9.8(它是所有 Android Java 程序的父级)。当您的应用程序启动时,Zygote 被分叉,因此 OpenSSL 已经映射到地址空间。这意味着您随身携带的 OpenSSL 版本未加载。稍后,您会崩溃,因为 0.9.8 和 1.0.1 不兼容二进制(即它们与 ABI 不兼容)。

您在构建包装共享对象 ( mylibcrypto.so) 方面是正确的。但是,mylibcrypto.so需要静态链接 OpenSSL 以避免上述问题。也就是说,mylibcrypto.so将需要链接到libcrypto.alibssl.a

于 2014-01-17T16:59:36.207 回答