【发布时间】:2016-12-28 23:10:13
【问题描述】:
我有一个 Cocoa Touch 框架,它由 99.9% 的纯 C 代码组成,上面只有一小层 Objective C。框架应该只导出一个名为mytestsymbol 的符号。为此,我创建了一个仅包含以下行的导出符号文件:
_mytestsymbol
然后我告诉链接器使用这个文件,方法是将它添加到 Xcode 中“构建设置/链接”中的“导出符号文件”条目中。
在 C 代码方面,mytestsymbol 看起来像这样:
void mytestsymbol(void)
{
start_the_whole_shebang();
}
但是,当构建框架并使用十六进制编辑器检查可执行文件的内容时,我可以看到几乎所有在我的 C 源代码中定义的全局符号仍然存在,但我不想公开这些!
在 Xcode 中检查 Cocoa Touch 框架的剥离选项时,我可以看到默认情况下它只是设置为“调试符号”,而在构建应用程序时它默认设置为“所有符号”。因此,我将框架的“条带样式”模式更改为“所有符号”并尝试将其存档。
但是,这也不起作用。现在strip在归档项目时返回以下错误:
Symbols referenced by indirect symbol table entries that can't be stripped in: ...
然后是符号列表。这些都是我的框架从其他框架导入的符号,例如来自 C 运行时的东西,如 printf、fopen 等,还有来自 Apple 框架的东西,如 CFBundleCopyBundleURL 等。
所以我认为我收到此错误是因为 strip 试图去除这些符号,但这当然是禁止的,因为我的框架需要这些符号。
那么我怎样才能告诉 Xcode只删除由我的框架定义的全局符号(mytestsymbol 除外)而不是从其他框架导入的任何其他内容?目前,似乎根本无法将 Cocoa Touch 框架的剥离样式设置为“所有符号”。只要将其设置为“所有符号”,strip(由 Xcode 调用)总是返回以下错误:
Symbols referenced by indirect symbol table entries that can't be stripped in: ...
请注意,我说的是仅剥离全局 C 符号。我知道 Objective C 不能像 C 一样被剥离,但这对我来说很好。我真的只关心 C 符号。我希望剥离所有 C 全局变量除了名为mytestsymbol 的符号。
有什么想法吗?
【问题讨论】:
标签: ios c xcode gcc ios-frameworks