Android用のOpenSSL1.0.1cの(.so)ファイル用の共有ライブラリを生成しようとしています。 AndroidスクリプトでAndroidをコンパイルするための3つのオプションが追加されていることがわかりました。
./Configure Android-armv7 (or)
./Configure Android-x86 (or)
./Configure Android
oS用に構成してからコンパイルしようとすると、スローエラーが発生します。現在、x86 windows7を使用しており、Cygwin、Android sdk R20、Android NDK r8
sh-4.1$ make
making all in crypto...
make[1]: Entering directory `/cygdrive/d/SourceCodes/OpenSSL/openssl-1.0.1c/crypto'
gcc -I. -I.. -I../include -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -march=armv7-a -mandroid -I/include -B/lib -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_MONT -DOP
ENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DGHASH_ASM -c -o cryptlib.o cryptlib.c
cc1: error: unrecognized command line option "-mandroid"
cryptlib.c:1:0: error: bad value (armv7-a) for -march= switch
<builtin>: recipe for target `cryptlib.o' failed
make[1]: *** [cryptlib.o] Error 1
make[1]: Leaving directory `/cygdrive/d/SourceCodes/OpenSSL/openssl-1.0.1c/crypto'
Makefile:278: recipe for target `build_crypto' failed
make: *** [build_crypto] Error 1
sh-4.1$
誰かが同様の問題に直面し、同じ問題を解決するための解決策を得た場合、私に知らせてください。
OpenSSL 1.0.1eでは、次のことを行うだけです。
CC=~/Android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc ./Configure Android-armv7
Android_DEV=~/Android-ndk-r9//platforms/Android-8/Arch-arm/usr make build_libs
ここに投稿された指示とその他の追加のおかげで、Androidをサポートする最新のOpenSSLライブラリをコンパイルする自動スクリプトを作成しました:armeabi、armeabi-v7a、x86、x86_64およびarm64-v8a:
#!/bin/bash -e
#@author Aleksandar Gotev ([email protected])
#Hints and code taken also from http://stackoverflow.com/questions/11929773/compiling-the-latest-openssl-for-Android
if [ "$#" -ne 6 ]
then
echo "Usage:"
echo "./openssl-build <Android_NDK_PATH> <OPENSSL_SOURCES_PATH> <Android_TARGET_API> \\"
echo " <Android_TARGET_ABI> <GCC_VERSION> <OUTPUT_PATH>"
echo
echo "Supported target ABIs: armeabi, armeabi-v7a, x86, x86_64, arm64-v8a"
echo
echo "Example using GCC 4.8, NDK 10e, OpenSSL 1.0.2d and Android API 21 for armeabi-v7a."
echo "./openssl-build /home/user/Android-ndk-r10e \\"
echo " /home/user/openssl-1.0.2d \\"
echo " 21 \\"
echo " armeabi-v7a \\"
echo " 4.8 \\"
echo " /home/user/output/armeabi-v7a"
exit 1
fi
NDK_DIR=$1
OPENSSL_BASE_FOLDER=$2
OPENSSL_TARGET_API=$3
OPENSSL_TARGET_ABI=$4
OPENSSL_GCC_VERSION=$5
OPENSSL_OUTPUT_PATH=$6
NDK_MAKE_TOOLCHAIN="$NDK_DIR/build/tools/make-standalone-toolchain.sh"
OPENSSL_TMP_FOLDER="/tmp/openssl"
rm -rf "$OPENSSL_TMP_FOLDER"
mkdir -p "$OPENSSL_TMP_FOLDER"
cp -r ${OPENSSL_BASE_FOLDER} ${OPENSSL_TMP_FOLDER}
function build_library {
mkdir -p ${OPENSSL_OUTPUT_PATH}
export PATH=$TOOLCHAIN_PATH:$PATH
make && make install
rm -rf ${OPENSSL_TMP_FOLDER}
echo "Build completed! Check output libraries in ${OPENSSL_OUTPUT_PATH}"
}
if [ "$OPENSSL_TARGET_ABI" == "armeabi-v7a" ]
then
${NDK_MAKE_TOOLCHAIN} --platform=Android-${OPENSSL_TARGET_API} \
--toolchain=arm-linux-androideabi-${OPENSSL_GCC_VERSION} \
--install-dir="${OPENSSL_TMP_FOLDER}/Android-toolchain-arm"
export TOOLCHAIN_PATH="${OPENSSL_TMP_FOLDER}/Android-toolchain-arm/bin"
export TOOL=arm-linux-androideabi
export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=${CXX}
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export Arch_FLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
export Arch_LINK="-march=armv7-a -Wl,--fix-cortex-a8"
export CPPFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" ${Arch_LINK} "
cd ${OPENSSL_TMP_FOLDER}
./Configure Android-armv7 --openssldir=${OPENSSL_OUTPUT_PATH}
build_library
Elif [ "$OPENSSL_TARGET_ABI" == "arm64-v8a" ]
then
${NDK_MAKE_TOOLCHAIN} --platform=Android-${OPENSSL_TARGET_API} \
--toolchain=aarch64-linux-Android-4.9 \
--install-dir="${OPENSSL_TMP_FOLDER}/Android-toolchain-arm64"
export TOOLCHAIN_PATH="${OPENSSL_TMP_FOLDER}/Android-toolchain-arm64/bin"
export TOOL=aarch64-linux-Android
export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=${CXX}
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export Arch_FLAGS=
export Arch_LINK=
export CPPFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" ${Arch_LINK} "
cd ${OPENSSL_TMP_FOLDER}
./Configure Android --openssldir=${OPENSSL_OUTPUT_PATH}
build_library
Elif [ "$OPENSSL_TARGET_ABI" == "armeabi" ]
then
${NDK_MAKE_TOOLCHAIN} --platform=Android-${OPENSSL_TARGET_API} \
--toolchain=arm-linux-androideabi-${OPENSSL_GCC_VERSION} \
--install-dir="${OPENSSL_TMP_FOLDER}/Android-toolchain-arm"
export TOOLCHAIN_PATH="${OPENSSL_TMP_FOLDER}/Android-toolchain-arm/bin"
export TOOL=arm-linux-androideabi
export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=${CXX}
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export Arch_FLAGS="-mthumb"
export Arch_LINK=
export CPPFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" ${Arch_LINK} "
cd ${OPENSSL_TMP_FOLDER}
./Configure Android --openssldir=${OPENSSL_OUTPUT_PATH}
build_library
Elif [ "$OPENSSL_TARGET_ABI" == "x86" ]
then
${NDK_MAKE_TOOLCHAIN} --platform=Android-${OPENSSL_TARGET_API} \
--toolchain=x86-${OPENSSL_GCC_VERSION} \
--install-dir="${OPENSSL_TMP_FOLDER}/Android-toolchain-x86"
export TOOLCHAIN_PATH="${OPENSSL_TMP_FOLDER}/Android-toolchain-x86/bin"
export TOOL=i686-linux-Android
export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=${CXX}
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export Arch_FLAGS="-march=i686 -msse3 -mstackrealign -mfpmath=sse"
export Arch_LINK=
export CPPFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" ${Arch_LINK} "
cd ${OPENSSL_TMP_FOLDER}
./Configure Android-x86 --openssldir=${OPENSSL_OUTPUT_PATH}
build_library
Elif [ "$OPENSSL_TARGET_ABI" == "x86_64" ]
then
${NDK_MAKE_TOOLCHAIN} --platform=Android-${OPENSSL_TARGET_API} \
--toolchain=x86_64-4.9 \
--install-dir="${OPENSSL_TMP_FOLDER}/Android-toolchain-x86_64"
export TOOLCHAIN_PATH="${OPENSSL_TMP_FOLDER}/Android-toolchain-x86_64/bin"
export TOOL=x86_64-linux-Android
export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=${CXX}
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export CPPFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" ${Arch_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" ${Arch_LINK} "
cd ${OPENSSL_TMP_FOLDER}
./Configure linux-x86_64 --openssldir=${OPENSSL_OUTPUT_PATH}
build_library
else
echo "Unsupported target ABI: $OPENSSL_TARGET_ABI"
exit 1
fi
スクリプトドキュメント: https://github.com/alexbbb/pjsip-Android-builder#build-only-openssl
最終バージョンのチェック: https://github.com/alexbbb/pjsip-Android-builder/blob/master/openssl-build
Androidで動作するOpenSSLのビルド環境に役立つアドバイスをここにまとめました。
ネイティブライブラリの1つで脆弱なバージョンのOpenSSL(< 1.0.2f/1.0.1r
)を使用する問題に誰かが遭遇した場合、詳細と指示を追加します。
前提条件:Android NDKを最初に設定する必要があります。
OpenSSL
互換バージョン(> 1.0.2f/1.0.1r
)をダウンロードします。このリンク から2つのスクリプトをダウンロードします。誰かが彼らが何をするのか疑問に思う場合(そしてあなたがすべき-暗号化ライブラリです!!!):彼らはAndroid ABIプロセッサアーキテクチャ(OpenSSL
、x86
)ごとにarmeabi
ライブラリを構築します、mips
など...)
Setenv-Android-mod.sh-> line 18
をndkバージョンに変更します
Setenv-Android-mod.sh-> line 40
をAndroid APIバージョン
Build-all-Arch.sh-> line 7
をOpenSSL
ライブラリーのフォルダー名で変更します(私の場合はopenssl-1.0.1t
でした)
ビルドが成功すると、フォルダーdist
内にライブラリーが存在します
openSSL
をビルド済みの静的ライブラリとしてプロジェクトに追加するには、次を作成します。
lib/
(サポートされるアーキテクチャの.a
ファイルを含む)を含むopenssl
ディレクトリの下のjni
フォルダー、include/
には必要なインクルードがあります(ダウンロードしたopensslバージョンでは、ヘッダーファイルの一部がシンボリックリンクであることに注意してください)以下を追加して、jni
フォルダー内のAndroid.mk
を変更します。
include $(CLEAR_VARS)
LOCAL_MODULE := libssl
LOCAL_SRC_FILES := lib/$(TARGET_Arch_ABI)/libssl.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libcrypto
LOCAL_SRC_FILES := lib/$(TARGET_Arch_ABI)/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)
次に、別のjni
モジュール内でライブラリを使用するには、Android.mk
ファイルに次を追加します。
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../openssl/include
LOCAL_STATIC_LIBRARIES := libssl libcrypto
CygwinとAndroid NDKを使用してWindowsでOpenSSLをビルドする方法は次のとおりです。
管理者ユーザーでcmd
を実行し、実行します
SET CYGWIN=winsymlinks:nativestrict
同じcmdウィンドウで、Cygwinを開きます。
cygwin.bat
スクリプトを実行可能にする:
chmod +x *.sh
Cygwinで次を実行します。
/cygdrive/c/dev/openssl-source/openssl-build.sh /cygdrive/c/dev/Android-ndk-r12b /cygdrive/c/dev/openssl-source/openssl-1.0.2j 15 armeabi-v7a 4.9 /home/user/openssl
Libcrypto.soとinclude/*ファイルをこのモジュールにコピーします。使用する cp -r
リンクをたどるコピー用。
このスクリプト を使用して、Windows 7 + Cygwinでopensslをコンパイルできます。必要なのは、ndkの場所を変更して、Android api version。
私の方法ステップバイステップ(Win 7 x64 + Cygwin + ndk r10c)
ファイルsetenv-Android-mod.sh
およびbuild-all-Arch.sh
をopensslディレクトリにコピーします。
ファイルの変更build-all-Arch.sh
cd openssl-1.0.1j
から#cd openssl-1.0.1j
(56行目)
cd ..
から#cd ..
へ(行80)
ファイルの変更setend-Android-mod.sh
_Android_NDK="Android-ndk-r10c-x64"
ndkバージョンへの変更(18行目)_Android_API="Android-19"
APIバージョンへの変更(行40)Android_NDK_ROOT="d:/work/Android/android-ndk-r10c-x64"
dirを指定します(42行目)Android_TOOLCHAIN="d:/work/Android/android-ndk-r10c-x64/toolchains"
dirを指定します(43行目)export CROSS_COMPILE="aarch64-linux-Android-"
からexport CROSS_COMPILE="$Android_TOOLCHAIN/aarch64-linux-Android-"
(219行目)、同じ行225、231、237、243を変更します-$Android_TOOLCHAIN/
をクロスコンパイルパスに追加します。build-all-Arch.sh
を実行します。
すべてのライブラリ(*.so
)は/prebuilt/
dirに配置されます。
追伸間違ったシンボリックリンクが原因でエラーがいくつかありましたが、次のコマンドを実行した後はすべて問題ありませんでしたexport CYGWIN="winsymlinks:native"
詳細は here を参照してください。
この問題と他の多くの問題により、1週間ほどいじくり回されましたが、最終的に問題を解決したので、解決策を共有したいと思いました。 OpenSSLは21+用にコンパイルでき、コードをハッキングしたい場合はAndroid 4.03デバイスで動作します。libcurlを使用しているため、最新である必要があります。手順は少し複雑です:
まず、ビルド可能なバージョンのlibcurlがあることを確認してください。良い出発点としてお勧めします https://github.com/cocos2d/cocos2d-x-3rd-party-libs-src
それらは最新のビルドスクリプトを保持します。
まず、「ビルド」でAndroid.iniをバージョン21にハックします
次に、次のスタブ関数をjniプロジェクトのどこかに追加する必要がありました。
// SPECIAL API 21+ functions required for Android to build on newer platform targets.
float strtof (const char* str, char** endptr)
{
return (float)strtod(str, endptr);
}
int __isnanf(float x)
{
return (x != x);
}
double atof (const char* s)
{
double rez = 0, fact = 1;
if (*s == '-'){
s++;
fact = -1;
};
for (int point_seen = 0; *s; s++){
if (*s == '.'){
point_seen = 1;
continue;
};
int d = *s - '0';
if (d >= 0 && d <= 9){
if (point_seen) fact /= 10.0f;
rez = rez * 10.0f + (float)d;
};
};
return rez * fact;
}
void srandom(unsigned int seed)
{
std::srand(seed);
}
static unsigned long _next = 1;
void srand(unsigned int seed)
{
_next = seed;
}
long random()
{
return Rand();
}
int Rand()
{
_next = _next * 1103515245 + 12345;
return (unsigned int)(_next/65536) % 32768;
}
/* the default is bsd */
__sighandler_t signal(int s, __sighandler_t f)
{
return 0;
}
シグナル関数はもっと良いかもしれませんが、私たちにとっては重要ではありません。これは、5 +(- https://groups.google.com/forum/#!topic/Android-ndk/RjO9WmG9pfE のヘッダーの変更によって引き起こされる4.03デバイスでの恐ろしい「シンボルを見つけられない」エラーを停止します。 =)。
次に、ビルドするopensslのバージョンのtar.gzをダウンロードし、どこかで解凍します。 crypto/ui/ui_openssl.cおよびcrypto/des/read_pwd.cを編集し、tcsetattrの#definesが使用されていないことを確認します。私はブルートフォース#if 0と#if 1を使用しました-これはプリプロセッサをいじることで可能になるはずですが、この時点でpointめました。誰かが正しい魔法を共有したいと思うなら、してください!
ここで、ファイルをtarballファイルに再tarする必要があります(そこにルートフォルダーを取得することを確認してください:
実行します(私の場合)
shasum -a 512 curl-7.50.0.tar.gz> ../src/curl/SHA512SUMS
これにより、cocos2d ./build.shが実行できるようになります。何かのようなもの:
./build.sh -p = Android --libs = openssl、curl --Arch = armv7 --mode = release
最後に-そして、これは普遍的な.aファイルを作成するという点で私を見つけましたが、直接質問の一部ではありません。NEON命令を使用しないバージョンを使用するようにしてください。 Tegra 2デバイスには明らかにFPUがありますが、NEONはありません。これはコンパイラフラグとして-mfpu = vfpを使用して実行できると思いますが、この領域ではパフォーマンスがあまり重要ではないので、代わりにarmv5ビルドを使用することを選択しました既に)。
最終的には、どこでも動作し、最新かつ最高のAndroidを対象とするプロジェクトで使用できるNice .aを取得する必要があります。 OpenSSLプロジェクトの誰かだけがこれを読み、プロジェクトを修正して、Android 2年前にリリースされたものを理解できるように!
幸運を!
これで問題は解決しませんが、おそらく役立つでしょう。 Googleグループは、Android向けのOpenSSL 1.0.1 beta2を正常にコンパイルした場所に投稿します。
https://groups.google.com/forum/?fromgroups#!topic/Android-security-discuss/5-_gCAmEo-M
これは、Android用に1.0.0aをビルドするオープンソースプロジェクトにも役立つ場合があります。
これは私がopenssl-1.0.2gのためにそれをした方法です:
$ rm -rf openssl-1.0.2g/
$ tar xzf openssl-1.0.2g.tar.gz
$ chmod a+x setenv-Android.sh
$ . ./setenv-Android.sh ---> Note: make sure in the same folder of your openssl-1.0.2g
$ cd openssl-1.0.2g/
$ Perl -pi -e 's/install: all install_docs install_sw/install: install_docs install_sw/g' Makefile.org
$ ./config shared no-ssl2 no-ssl3 no-comp no-hw no-engine --openssldir=<Path of your OpenSSL>
$ make depend
$ make clean
$ make all
before make install, ---Delete the "include" folder (path/of/your/openssl-1.0.2g/include) or you may move it to another directory for safe keeping.
$ make install
Setenv-Android.shに正しいNDKパスを入力してください。そうしないと、エラーが発生します。
使用したこのビルドの例Android NDK vr10b( http://dl.google.com/Android/ndk/Android-ndk32-r10b-darwin-x86.tar.bz2 )そして、setenv-Android.shファイル内でffパス値を使用しました:
_Android_NDK="Android-ndk-r10b" (Line 12)
_Android_EABI="arm-linux-androideabi-4.8"(Line 16)
_Android_API="Android-19"(Line 24)
リファレンス: https://wiki.openssl.org/index.php/Android
注--->この質問に答えるためにgithubコミットを作成しました: https://github.com/rjmangubat23/ OpenSSL
Setenv-Android.shのさまざまなスクリプトをgithubにアップロードしました。アーキテクチャごとに異なるタイプのスクリプトが必要になるためです。
X86の場合: https://github.com/rjmangubat23/OpenSSL/tree/master/x86
ArmV7の場合: https://github.com/rjmangubat23/OpenSSL/tree/master/ArmV7
ここからOpensslをダウンロードしてください: ftp://ftp.openssl.org/source
Android NDKファイルの完全なリストはこちら: https://github.com/taka-no-me/Android-cmake/blob/master/ndk_links.md