如何将 armv7 二进制文件转换为 i386/x86_64

How do I convert an armv7 binary to i386/x86_64

我正在尝试构建一个 mac(cocoa) 应用程序。我有一个框架,我正在尝试 link 已经为 iOS(armv7 arch)编译。不幸的是,我不再拥有用于编译原始框架的源代码。是否可以更改框架的体系结构(可能通过反编译然后重新编译)以便它可以编译到我的 cocoa 应用程序中?

到目前为止,我已经研究了 lipo 和 fat 二进制文件以及使用 optool 进行反编译,但在转换体系结构方面没有取得任何直接进展。

感谢您的帮助。

不,没有合理的方法来自动执行此转换。大多数 C 反编译器生成的代码是程序集的直译。通常不适合编译。

(一个好的反编译器是 IDA Pro 的 Hex-Rays 插件。但是,它非常昂贵——一个许可证超过 2000 美元。除非你的框架特别大和复杂,否则它可能更贵-没有这个工具也能有效工作。)

如果你真的丢失了源代码,你唯一的选择就是重写框架。您可以使用反汇编来指导您的工作,但您需要填写一些详细信息。

理论上,如果代码不直接使用任何 POSIX 系统调用,则可能会产生科学怪人的憎恶:

  • 运行 arm64 模拟器上的代码。
  • 用模拟器陷阱替换 Objective-C 运行时(例如 objc_msgsend)中的所有函数调用链接。
  • 如果发现任何其他函数调用链接,请中止。
  • 对于运行时函数调用,在 x86-64 端调用等效的运行时函数。
  • 对于分配调用,return arm64 端的 NSProxy 对象陷入模拟器。
  • 对于通过参数、return 值或 return 参数传递的任何对象,传递 NSProxy 对象。

也就是说,在实践中,除非框架非常复杂,否则重写代码会更快。实际上,即使它非常复杂,如果您了解足够多的 arm64 asm 来完成它,您可能可以更快地从 asm 重写它。 :-)