【问题标题】:OpenSSL Compiled to Run on Android x86 ArchitectureOpenSSL 编译为在 Android x86 架构上运行
【发布时间】:2014-07-30 14:19:23
【问题描述】:

我一直在碰壁:我已经让 openssl 编译得很好,适用于 android armeabi 架构,但对 x86 的帮助要少得多,而且我在 openSSL 上找不到任何东西网站。

我最终发现了一篇关于将 openssl 用于 x86 架构的英特尔文章 (https://software.intel.com/en-us/articles/using-intel-advanced-encryption-standard-new-instructions-on-android#openssl),在创建了一个独立的工具链并检查了他们提供的代码并修复了其中的一些之后,我正处于 make在以一堆未定义的对“XXX”语句的引用失败之前,将几乎一直通过编译。我现在不知道如何解决这个问题,任何帮助将不胜感激。

如果这最终有点微不足道,我深表歉意,我是新手。

追踪:

/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 选项设置为 android 独立钥匙串上的 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

【问题讨论】:

    标签: android gcc openssl makefile cross-compiling


    【解决方案1】:

    看来我已经想通了。使用我发布的代码(因为文章中的代码在语法上略有错误,但想法是正确的)并且在制作了自定义 android 工具链之后,我能够在全新安装 OpenSSL 后成功运行 make。我的猜测是,当我回到 x86 架构时,我为编译 ARM 架构 *.a 和 *.so 文件所做的工作可能搞砸了。

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

    【讨论】:

    • 由于在使用 ARM 架构和 openssl 的 setenv 脚本之外的任何东西所需的错误和修复的数量,我发现这是一种更简单的方法。
    • "...我的猜测是我为编译 ARM 架构 *.a 和 *.so 文件所做的工作可能搞砸了..." - 在更改平台之前,你可能应该运行make clean && make dclean。这将清除以前平台的麻烦。
    • 就我而言,我可以通过打开一个新终端来继续。如果您尝试为您的架构构建使用相同的终端,您的路径将会变脏。
    【解决方案2】:

    但是对于 x86 的帮助要少得多,而且我在 openSSL 的网站上找不到任何内容

    我相信 OpenSSL wiki 涵盖了这个主题:OpenSSL and Android


    我最终发现了一篇关于使用 openssl for x86 架构的英特尔文章...

    您只需选择正确的 abi。根据 Android wiki 页面,您在 setenv-android.sh 脚本中调整以下内容:

    • _ANDROID_NDK – NDK 的版本。例如,android-ndk-r8e
    • _ANDROID_EABI – EABI 工具的版本。例如 arm-linux-androideabi-4.6
    • _ANDROID_API – API 级别。比如android-14

    在 wiki 上有一个完整的小节:Adjust the Cross-Compile Script。请让我们知道是否有任何差距。 (我针对 ARM 进行了测试,但不是 x86)。

    有很多 ABI 可供选择。您可能想要x86-4.6API 14API 18

    可能必须修改Configure,但看起来你并没有那么远,所以目前很难说。你不需要修改配置 - 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 文件的外观,而不是所有文件的转储)。

    【讨论】:

    • 即使在将 eabi 切换到 x86 文件夹并修复 setenv 脚本的路径错误后,运行 ./config 仍然会吐出该项目“为 android-armv7 配置”,然后在“ makedepend" 指出 /util/domd 中的命令 arm-linux-androideabi-gcc 找不到。
    【解决方案3】:

    我在这里有类似的答案https://stackoverflow.com/a/37043683/2210080,但这是针对 ArmV7 的。只需执行与之前相同的过程,但使用这个特定的 setenv-android.sh 脚本:https://github.com/rjmangubat23/OpenSSL/blob/master/x86/setenv-android.sh

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 1970-01-01
      • 2017-01-31
      • 2019-03-12
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      相关资源
      最近更新 更多