如何在 armv7 架构中构建 mcrypt 库?

Posted

技术标签:

【中文标题】如何在 armv7 架构中构建 mcrypt 库?【英文标题】:How to build mcrypt library in armv7 architecture? 【发布时间】:2018-01-26 00:31:13 【问题描述】:

我正在使用 PJSIP 开源库进行 AES 加密。用于 AES 加密 的库不是 C 编程中可用的内置库。所以,我使用 external library (Libmcrypt) 进行 AES 加密。

我按照这个网站将 libmcrypt 库构建到我的机器(MAC OSX)中。 https://coolestguidesontheplanet.com/install-mcrypt-php-mac-osx-10-10-yosemite-development-server/

https://gist.github.com/bricef/2436364

在构建这些库时,它在 /usr/local/lib/ 路径中创建了一个动态库(libmcrypt.dylib)。使用 lipo -info libmcrypt.dylib 命令检查该库的体系结构时,它显示

Non-fat file: libmcrypt.dylib is architecture: x86_64

但我正在使用 PJSIP 为 AndroidIOS 设备创建这些应用程序。他们的架构是 armeabi(android) 和 armv7(ios)。

将 libmcrypt.dylib(x86_64) 链接到 PJSIP 库(armv7) 时,显示以下错误。

Undefined symbols for architecture armv7:
  "_mcrypt_enc_get_block_size", referenced from:
      _encrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
      _decrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
  "_mcrypt_generic", referenced from:
      _encrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
  "_mcrypt_generic_deinit", referenced from:
      _encrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
      _decrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
  "_mcrypt_generic_init", referenced from:
      _encrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
      _decrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
  "_mcrypt_module_close", referenced from:
      _encrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
      _decrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
  "_mcrypt_module_open", referenced from:
      _encrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
      _decrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
  "_mdecrypt_generic", referenced from:
      _decrypt_AES in libpjsip-armv7-apple-darwin_ios.a(aes.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [../bin/pjsip-test-armv7-apple-darwin_ios] Error 1
make[1]: *** [pjsip-test-armv7-apple-darwin_ios] Error 2
make: *** [all] Error 1

我对这些架构了解不多。是否可以将 libmcrypt.dylib(x86_64) 转换为 libmcrypt.dylib(armv7)。如果是,请指导我如何将其转换为 armv7 架构,如果不是,那么很抱歉浪费您的时间。

提前致谢!

【问题讨论】:

不,您不能(轻松)从 x86_64 转换为 armv7。您需要从源代码进行交叉编译。 @lan 如果您不介意,请参考我如何将 x86_64 交叉编译成 armv7 架构。 您不交叉编译 x86_64 二进制文件,而是交叉编译源代码。您为 Android/iOS 安装的开发工具包应该包括一个在您的 MAC OSX 主机上运行并为 Android/iOS 生成 armv7 二进制文件的交叉编译器。您需要在适当的开发环境中构建 mcrypt。 我想为 armv7 架构构建 libmcrypt 库。基本上它是为您正在构建的机器而构建的。就像你在 mac os 上构建一样,它会产生 x86_64 架构库。但我想构建 armv7 架构 libmcrypt 库。如何将 libmcrypt 库交叉编译成 armv7 架构?我从这个链接使用 libmcrypt 库。 link 请注意,MCrypt 库不是updated since 2007。 highly recommended 你切换到 OpenSSL 或其他维护的加密项目。 【参考方案1】:

我们可以使用下面的 openssl(Github) 项目,而不是使用 libmcrypt 库,按照上述答案的建议在所有架构上创建库。谢谢@Tim。

使用此项目 build-libssl.sh 文件为 Android 和 IOS 上的所有架构进行编译。

对于Android

https://github.com/ruslansalikhov/openssl-for-android

对于IOS

https://github.com/x2on/OpenSSL-for-iPhone

只需下载并使用 build-libssl.sh 文件编译项目。它将为您的平台创建所有库。在 AndroidIOS 中。

下载项目并使用 cmd/terminal 进入项目目录。

cd OpenSSL-for-iPhone/

使用以下命令编译项目,

./build-libssl.sh

注意: 机器必须安装 gcc 编译器和 SDK(Android ndk 和 IOS)。

编译成功后,转到您的 PROJECT_DIR(OpenSSL-for-iPhone)/lib 文件夹。检查是否为所有架构创建了四个库。

使用以下命令检查 library 文件的supported Architectures。进入cmd/终端界面的lib路径查看,

lipo -info libcrypto.a

它将显示库文件支持哪些架构。

fat 文件中的架构:libcrypto.a 是:i386 armv7s armv7 x86_64 arm64

【讨论】:

【参考方案2】:

不要使用 mcrypt。 MCrypt 库不是updated since 2007。 highly recommended 你切换到 OpenSSL 或其他维护的加密项目。

PJSIP 文档有关于如何在 IOS 和 Android 设备上使用 OpenSSL 的说明:

https://trac.pjsip.org/repos/wiki/Getting-Started/iPhone#OpenSSLSupport https://trac.pjsip.org/repos/wiki/Getting-Started/Android#OpenSSLSupport

【讨论】:

非常感谢...!我点击了这个链接github.com/x2on/OpenSSL-for-iPhone。只需使用 build-lib 下载并使用 openssl 编译 iPhone GitHub 项目。它在所有架构中都提供了 libcrypto.a 和 libssl.a 库(i386 armv7s armv7 x86_64 arm64)。

以上是关于如何在 armv7 架构中构建 mcrypt 库?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 armv7s 架构添加到 xcode 7 / ios 9 中的静态库?

归档时应用程序获取“架构 armv7 的未定义符号”,除非我不剥离库中的链接产品

mac上的iOS模拟器运行的是i386架构,不是armv7?

我可以构建 Armv7 + Arm64 架构,但不能单独构建 Armv7

Worklight 6.0.0.1 iOS 本机库仅适用于 ARMv7 而不适用于 ARMv7s 和 ARM64?

docker如何构建多架构(arm64, x86_64, armv7)容器镜像?