gpt4 book ai didi

ios - 重写静态 iOS 库中的符号

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:11:08 24 4
gpt4 key购买 nike

我正在开发一个链接多个静态库的 iOS 应用程序。挑战在于,那些链接库定义了具有不同实现的相同方法名称。奇怪的是,我没有收到任何 duplicate symbol definition 错误;但是,毫不奇怪,我最终只能访问该方法的一个实现。

更清楚地说,假设我有 libA 和 libB,它们都定义了一个名为 func1() 的全局 C 方法

当我同时链接 libA 和 libB 并调用 func1() 时,它会在没有任何编译警告的情况下解析为 libA 或 libB 的实现。但是,我需要能够分别访问 libA 的 func1() 和 libB 的 func1()。

There's a similar SO post这解释了如何在 C 中完成它(通过符号重命名),但不幸的是,正如我发现的那样,objcopy 工具不适用于 ARM 架构(因此适用于 iPhone)。

(我会把它提交到 App Store,因此动态链接不是一个选项)

最佳答案

看起来您很幸运 - 您仍然可以使用 ARM 二进制格式重命名符号,它只是比 objcopy 方法更 hacky 一点...

注意:这只经过了最低限度的测试,我强烈建议您在尝试之前备份所有有问题的库!

另请注意,这仅适用于未使用 C++ 编译器编译的文件!如果对这些文件使用 C++ 编译器,这失败。

  1. 首先,你需要一个像样的十六进制编辑器,对于这个例子,我将使用Hex Fiend。 .
  2. 接下来,您将打开您的库的副本,我们将其命名为 lib1-renamed.a,然后使用它执行以下操作:

    • 找到您要重命名的交易品种的名称。可以使用 nm 工具找到它,或者,如果您知道 header 名称,则应该进行设置。

    • 接下来,您将使用 hex fiend,并用文本替换旧名称(在本例中为 foo),并为其指定一个新名称(在本例中为 )。这些名称​​必须具有相同的长度,否则会破坏二进制文件的偏移量!

      注意:如果有多个函数包含foo的名称,您可能会遇到问题。

  3. 现在,您必须编辑您更改的库的 header ,以使用新函数名称 (bar) 而不是旧函数名称。

如果您已正确完成上述三个简单的步骤,您现在应该能够成功编译和链接这两个文件,并调用这两个实现。

如果您尝试使用通用二进制文件(例如模拟器上的作品)执行此操作,您最好使用 lipo 来分隔两个二进制文件,使用 objcopy 在 i386/x64 二进制文件上,然后在 ARM 二进制文件上使用我的方法,然后 lipo 将它组合在一起。

†:不保证简单性,也不在 Richard J. Ross III super 保修范围内。有关 super 保修的更多信息,请立即调用 1-800-FREE-WARRANTY。现在是 1-800-FREE-WARRANTY!

关于ios - 重写静态 iOS 库中的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15345491/

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