【问题标题】:Merge Mach-O executable with a static lib?将 Mach-O 可执行文件与静态库合并?
【发布时间】:2012-11-15 20:05:34
【问题描述】:

假设你有

  1. 预构建的 iOS 可执行应用程序(用于模拟器或设备)。
  2. 一个预构建的静态存档库静态库,其中包含 c++ 静态初始化程序。

现在应该可以合并两个构建的产品以生成一个新的 iOS 可执行文件,它与旧的一样,只是它现在还与附加的静态库链接,并且在执行时将运行静态库的静态初始化器。

哪个工具(如果有)可以帮助解决这个合并问题?

编辑:一个可接受的解决方案也是使用 dlopen 动态加载库。这样做的全部目的是为了应用程序测试,所以重新链接的应用程序永远不会看到应用程序商店。

【问题讨论】:

  • 听起来你应该可以用标准链接器来做一些事情。不过,我已经很多年没有做过类似的事情了。一个好的开始是手册页,通过命令行查找静态链接库的一些示例,并开始查看将基本项目与添加的库链接的命令行输出。
  • 不,标准链接器 ld 无法与可执行文件链接:ld: can't link with a main executable for architecture i386
  • 如何在没有静态库的情况下首先构建 ios 应用程序?我在这里有点困惑......
  • 问题是我没有项目源代码。其他人构建了 ARM .ipa 或 i386 .app,我想在二进制文件上链接静态(或动态加载)库。这是出于测试目的。
  • 类似的事情可以通过反汇编、破解汇编语言和重建来完成。一项巨大的工作,结果令人怀疑。如果这样做是所涉及的许可证甚至允许的。而@slycrel,链接器不会为你做这件事。为什么会呢,它的用例完全不同。

标签: c++ ios mach-o


【解决方案1】:

编译器的工作原理(简单解释)

最流行的 C++ 编译器(比如 GCC)通过将所有 C++(以及 Obj-C、C 等)代码转换为 ASM 来工作。

然后它为目标处理器调用适当的汇编程序,并创建对象二进制文件。

然后它调用链接器,在这些二进制文件中搜索解释什么与什么链接的符号。链接器可以做的一个常见优化也是从静态链接的库中删除最终二进制文件中未使用的任何内容,其他常见的优化是不尝试链接所有未使用的库。

最后,链接器删除了它只需要的东西。

这对你来说意味着什么

你有一个库,这个库有链接符号。您还有一个可执行文件,它的链接符号已被剥离,实际上取决于它的优化方式,内部跳转可能只是几条 jmp 指令到代码上的任意地址。没有机器可以自动执行您想要的操作,因为您没有可执行文件所需的信息。

怎么做

您需要反汇编可执行文件,自行确定函数调用的位置,然后用您的库手动重新组装它,将这些函数调用更改为跳转到库中的地址。

游戏模式有时会使用此过程来更改旧游戏的视频驱动程序(例如更新其 OpenGL 版本,或强制 Glide 游戏使用一些较新的驱动程序,等等)。

所以如果你还是想这样做(我警告你:这样做太疯狂了......)问那些人:) 我现在不记得有人指向你,但他们确实存在。

类比

当您处于正常链接阶段时,编译后的目标文件就像机器可以理解的源代码,根据需要充满了函数调用。

编译后,所有的函数调用都变成了goto。

因此,如果您是一个负责执行您想做的事情的链接器,想象一下您将阅读一个充满 goto 的源代码到代码中的随机位置(有时甚至是内部循环),并且您必须以某种方式计算您想要更改哪些内容以跳转到您尝试粘贴的新部分。

【讨论】:

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