【问题标题】:Android.mk Unable to link with libcryptoAndroid.mk 无法与 libcrypto 链接
【发布时间】:2014-01-29 03:43:46
【问题描述】:

案例:

我正在构建一个使用libcryptolibssl 的应用程序。我正在尝试使用预构建的 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'
...

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

【问题讨论】:

  • 作为一种解决方案,我也尝试过这种方式来创建预构建的共享库。 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mylibssl LOCAL_SRC_FILES := libssl.so include $(PREBUILT_SHARED_LIBRARY) 但是为此,(当调用 My App/mylibssl/Android.mk 时),我收到消息是: make: `all_modules' 无事可做。因此不会创建预构建的库。
  • 进一步调试,发现中间目录下只创建了export_includes,没有.so文件。这就是我们得到错误的原因:未定义对'BIO_new_mem_buf'的引用。但是为什么这个Android.mk文件只生成export_includes!?
  • 为什么这个问题被否决了?这是我的第一个问题。有什么问题吗?
  • "为什么这个问题被否决了?" - 只是猜测,但可能是由于缺乏格式。
  • “我花了几个小时试图弄清楚并且完全陷入困境。” - github 有很多在 NDK 构建系统下构建 OpenSSL 的项目。它应该和复制/粘贴一样难:openssl android site:github.com.

标签: android android-ndk openssl libcrypto android.mk


【解决方案1】:

我正在构建一个使用 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 库。这可能是路径问题,假设您有可用的 Android 版本的 OpenSSL 库。


如果您需要 Android 版本的 OpenSSL 库,您可以自己构建或在 Github 上找到它。要自己构建它,请参阅FIPS Library and 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多