如何剥离 Cocoa 触摸框架

How to strip Cocoa Touch Frameworks

我有一个 Cocoa Touch 框架,它由 99.9% 的纯 C 代码组成,上面只有一小层 Objective C。该框架应该只导出一个名为 mytestsymbol 的符号。为此,我创建了一个仅包含以下行的导出符号文件:

_mytestsymbol

然后我告诉链接器使用这个文件,方法是将它添加到 Xcode 中的 "Build Settings/Linking" 中的 "Exported Symbols File" 条目。

在 C 代码方面,mytestsymbol 看起来像这样:

void mytestsymbol(void)
{
    start_the_whole_shebang();
}

但是,在构建框架并使用十六进制编辑器检查可执行文件的内容时,我可以看到几乎所有在我的 C 源代码中定义的全局符号仍然存在,但我不想公开这些符号!

在 Xcode 中检查 Cocoa Touch 框架的剥离选项时,我可以看到默认情况下它只是设置为 "Debugging symbols" 而在构建应用程序时它设置为 "All symbols" 默认。因此,我将框架的 "Strip style" 模式更改为 "All symbols" 并尝试将其存档。

但是,这也不起作用。现在stripreturns归档项目时出现如下错误:

Symbols referenced by indirect symbol table entries that can't be stripped in: ...

然后是符号列表。这些都是我的框架从其他框架导入的符号,例如来自 C 运行时的东西,如 printffopen 等,还有来自 Apple 框架的东西,如 CFBundleCopyBundleURL 等。

所以我认为我收到此错误是因为 strip 试图去除这些符号,但这当然是被禁止的,因为我的框架需要这些符号。

那么我如何才能告诉 Xcode 仅去除 由我的框架定义的全局符号(mytestsymbol 除外)而不是从其他导入的任何其他符号构架?目前,对于 Cocoa Touch Frameworks,似乎根本无法将剥离样式设置为 "All symbols"。每当将其设置为 "All symbols" 时,strip(由 Xcode 调用)总是 returns 出现以下错误:

Symbols referenced by indirect symbol table entries that can't be stripped in: ...

请注意,我只是在谈论剥离全局 C 符号。我知道 Objective C 不能像 C 那样被剥离,但这对我来说很好。我真的只关心 C 符号。我希望所有 C 全局变量都被剥离 除了 名为 mytestsymbol.

的符号

有什么想法吗?

回答我自己的问题:在 Cocoa Touch Frameworks 中使用 strip 样式 "All Symbols" 是不可能的,因为 relocatable 动态库(Cocoa Touch Frameworks 基本上are) 引用外部符号如 printf 需要一个间接符号 table 如果 "Strip Style" 设置为 "All Symbols".

则不会存在

因此,"Strip Style" 应该简单地设置为 "Non-Global Symbols"。这里的命名有点混乱,因为 "Non-Global Symbols" 听起来好像 strip 没有去除上面代码中的 mytestsymbol 这样的符号(因为它是一个全局符号)但实际上它确实去除了它。所以只使用 "Non-Global Symbols" 条带样式就可以完美地工作。