OpenSSL编译成适用于Android x86架构的版本

4
我一直在为这个问题苦恼:我已经成功编译了openssl适用于android armeabi架构,但是对于x86架构的支持要少得多,而且在openSSL网站上找不到任何相关信息。最终我找到了英特尔公司的一篇文章(https://software.intel.com/en-us/articles/using-intel-advanced-encryption-standard-new-instructions-on-android#openssl),它介绍了如何使用openssl适用于x86架构。在创建了一个独立的工具链之后,我按照提供的代码进行了修复,但在编译过程中,make会在几乎完成所有编译操作之后失败,并出现大量未定义引用“XXX”的语句。目前我无法解决这个问题,非常希望能得到帮助。
如果这个问题很琐碎,我表示歉意,因为我对make非常陌生。
跟踪信息:
/private/tmp/my-android-toolchain/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: ts.o: 在函数ts_main:ts.c(.text+0x1e8a)中:错误:未定义对'TS_RESP_set_tst_info'的引用 /private/tmp/my-android-toolchain/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: ts.o: 在函数ts_main:ts.c(.text+0x1ea2)中:错误:未定义对'TS_TST_INFO_free'的引用 /private/tmp/my-android-toolchain/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: srp.o: 在函数srp_verify_user:srp.c(.text+0xb3)中:错误:未定义对'SRP_create_verifier'的引用 /private/tmp/my-android-toolchain/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: srp.o: 在函数srp_create_user:srp.c(.text+0x1e3)中:错误:未定义对'SRP_create_verifier'的引用 /private/tmp/my-android-toolchain/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: srp.o: 在函数srp_main:srp.c(.text+0x1014)中:错误:未定义对'X509_get_default_cert_area'的引用 /private/tmp/my-android-toolchain/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: srp.o: 在函数srp_main:srp.c(.text+0x10c0)中:错误:未定义对'SRP_get_default_gN'的引用 /private/tmp/my-android-toolchain/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld: srp.o: 在函数srp_main:srp.c(.text+0x16dd)中:错误:未定义对'TXT_DB_insert'的引用
抱歉,由于在setenv脚本中他们指定了eabi,我认为这意味着只能选择ARM eabi之一,因为其他架构没有使用它进行指定。我查看了openSSL有关在Android上编译ARM的说明,但我不知道它也适用于x86。如果是这样,那么我感到很愚蠢。 我将--sysroot选项设置为独立密钥链上的sysroot。
以下是我按照英特尔有关此主题的文章所使用的x86编译命令。
    export CC="$STANDALONE_TOOCHAIN_PATH/bin/i686-linux-android-gcc -mtune=atom -march=atom --sysroot=$STANDALONE_TOOCHAIN_PATH/sysroot"
    export AR=$STANDALONE_TOOCHAIN_PATH/bin/i686-linux-android-ar
    export RANLIB=/private/tmp/my-android-toolchain/bin/i686-li
    ./Configure android-x86 -DOPENSSL_IA32_SSE2 -DAES_ASM -DVPAES_ASM
3个回答

3
“但是对于x86的帮助要少得多,我在OpenSSL的网站上也找不到相关内容。”
“我相信OpenSSL的维基已经涵盖了这个主题:OpenSSL和Android。”
我最终找到的是一个英特尔文章...关于在x86架构中使用openssl。您只需选择正确的abi。根据Android维基页面,您需要在setenv-android.sh脚本中进行以下调整:
_ANDROID_NDK - NDK的版本。例如android-ndk-r8e _ANDROID_EABI - EABI工具的版本。例如arm-linux-androideabi-4.6 _ANDROID_API - API级别。例如android-14
维基上有一个完整的子部分:Adjust the Cross-Compile Script。如果有任何差距,请告诉我们。(我已经对ARM进行了测试,但没有对x86进行过测试)。
有很多ABI可供选择。您可能想选择x86-4.6和API 14或API 18。

enter image description here

你不需要修改配置文件 - android-x86 目标已经存在。

/private/tmp/my-android-toolchain/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld:ts.o: 在函数ts_main:ts.c(.text+0x1e8a)中:错误:未定义的引用'TS_RESP_set_tst_info' /private/tmp/my-android-toolchain/bin/../lib/gcc/i686-linux-android/4.6/../../../../i686-linux-android/bin/ld

这看起来几乎像是你缺少了--sysroot。肯定出了一些问题。

你应该展示给我们编译行和链接行之一(C文件之一的样子,而不是所有文件的转储)。


1
即使将eabi切换到x86文件夹并修复了setenv脚本中的路径错误,运行./config仍然会输出项目“配置为android-armv7”,然后在“make depend”上失败,指出/util/domd中的arm-linux-androideabi-gcc命令找不到。 - JBires

3

看起来我已经找到了解决方法。使用我发布的代码(因为文章中的代码在语法上略有错误,但思路是正确的),并在制作完自定义Android工具链后,我能够在OpenSSL新安装后成功运行make命令。我猜测,在编译ARM架构*.a和*.so文件时所做的工作可能会在返回x86架构时出现问题。

如果不确定如何创建独立工具链(请使用简单方法):http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html


由于使用openssl的setenv脚本时,除了ARM架构以外的其他架构需要修复大量错误,我发现这是一个更容易的解决方法。 - JBires
1
“...我的猜测是,在编译ARM架构*.a和*.so文件时所做的工作可能搞砸了什么......” - 在更改平台之前,您应该运行make clean && make dclean。这将清除以前平台上的垃圾。 - jww
在我的情况下,我可以通过打开一个新的终端来继续进行。如果您尝试在同一终端上进行架构构建,则路径将变得混乱。 - Jorge Gil

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接