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

kru*_*kow 7 c++ mach-o ios

假设你有

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

现在应该可以合并两个构建的产品来生成一个新的iOS可执行文件,就像旧的一样,除了它现在还与附加的静态库链接,并且在执行时将运行静态库的静态初始化程序.

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

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

spe*_*der 1

编译器如何工作(简单解释)

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

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

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

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

这对你的情况意味着什么

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

无论如何该怎么做

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

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

所以,如果你无论如何都想这样做(我警告你:这样做是荒谬的疯狂......)问问那些人:)我现在不记得有人指出你,但他们存在。

比喻

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

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

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