使用静态库合并Mach-O可执行文件?

时间:2012-11-15 20:05:34

标签: c++ ios mach-o

假设你有

  1. 预构建的iOS可执行应用程序(用于模拟器或设备)。
  2. 预构建的静态归档库静态库,其中包含c ++静态初始化器。
  3. 现在应该可以合并两个构建的产品来生成一个新的iOS可执行文件,就像旧的一样,除了它现在还与附加的静态库链接,并且在执行时将运行静态库的静态初始化。

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

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

1 个答案:

答案 0 :(得分:1)

编译器的工作原理(简单说明)

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

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

然后它调用链接器,在这些二进制文件上搜索解释与什么链接的符号。链接器可以执行的常见优化,也是从未使用的静态链接库中剥离最终二进制文件,其他常见优化不会尝试链接所有未使用的库。

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

这意味着你的意思

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

无论如何如何做

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

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

所以,如果你想要这样做(我警告你:虽然做起来很荒谬......)问那些家伙:)我现在不记得有人指向你,但他们存在。< / p>

类比

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

编译完成后,所有函数调用都变为goto。

因此,如果您是一个负责执行您想做的事情的链接器,那么想象一下,您将在代码中的随机位置读取填充了goto的源代码(有时甚至是内部循环)并且您必须以某种方式形成那些你想要改变的人跳到你试图粘贴的新部分。