【问题标题】:Convert .so code from ARM to x86 on Android在 Android 上将 .so 代码从 ARM 转换为 x86
【发布时间】:2013-09-07 07:36:37
【问题描述】:

我正在尝试将 NDK 生成的已为 ARM Android 设备编译的 .so 文件转换为 x86 设备的 .so 文件。

我可以获取 .so 文件并使用 objdump 来读取程序集,但 objdump 并没有真正将其转换为我可以重新编译它的格式——所以将机器代码指令转换为一个似乎更容易——一对一。

有什么想法吗?我希望将 ARM 库转换为 x86,以便来自 NDK 的本机代码 ARM 应用程序在我的 x86 Android VMWare 上运行得更好。

【问题讨论】:

  • 我不认为这是可行的(尽管已经有像 Transmeta 芯片这样的设计,所以..)。这不是一个真正的[微不足道的]“一对一”操作,因为许多方面都不同 - 尽管可能有高级转译器(适用于机器代码?)工具,但我不会花太多时间探索这条路线。
  • 你不能问发布ARM版本库的人要x86版本吗? (我假设它是封闭源代码,否则你可以自己构建它)
  • 一种方法是运行decompiler,然后在输出上使用x86 编译器。这并不简单。这将生成比直接翻译更好的代码。首先,ARM 有 16 个寄存器,因此您很难在 x86 上模拟它。 decompiled 输出将允许 x86 编译器智能地分配寄存器与帧变量。 Stack Overflow上有很多这样的问题。如果代码量很小,也可以检查 assembler 并对例程流程进行逆向工程; decompiling 代码将在这里提供帮助。

标签: android assembly android-ndk x86 arm


【解决方案1】:

你说的是二进制翻译。您可以阅读有关他们基于 x86 的移动设备的 Intel's solution 的信息。

这通常不是一件容易解决的事情。您可以尝试调整QEMU 的引擎,它将二进制文件转换为中间格式,然后从中生成本机代码,但如果您使用过Android 模拟器,您就会知道该解决方案的性能可能很差。

【讨论】:

    【解决方案2】:

    或许你可以使用下面的步骤重新编译,

    1. 在 Android makefile 中添加 APP_ABI := armeabi armeabi-v7a x86 并重建项目
    2. 在命令提示符下(如果没有找到 makefile)使用以下命令 ndk-build APP_ABI="armeabi armeabi-v7a x86"
    3. 为 x86 平台再次打包应用程序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多