3

場合:

libcryptoとを使用するアプリを作成していますlibssllibcrypto.soビルド済みのアプリケーションを使用しlibssl.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 ライブラリに対してリンクしていないことを意味します。Android バージョンの OpenSSL ライブラリが利用可能であると仮定すると、おそらくパスの問題です。


OpenSSL ライブラリの Android バージョンが必要な場合は、自分でビルドするか、Github で見つけることができます。自分でビルドするには、FIPS Library と 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

オプション 2 では、 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.aありlibssl.aます。

于 2014-01-17T16:59:36.207 に答える