gpt4 book ai didi

c++ - 将 Mach-O 可执行文件与静态库合并?

转载 作者:可可西里 更新时间:2023-11-01 03:34:38 26 4
gpt4 key购买 nike

假设你有

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

现在应该可以合并这两个构建的产品来生成一个新的 iOS 可执行文件,它与旧的一样,除了它现在还链接到额外的静态库,并且在执行时将运行静态库的静态初始值设定项。

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

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

最佳答案

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

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

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

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

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

这对你的情况意味着什么

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

无论如何怎么做

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

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

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

类比

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

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

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

关于c++ - 将 Mach-O 可执行文件与静态库合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com