2016-12-28 109 views
0

我有一个Cocoa Touch框架,它由99.9%纯C代码组成,只有一小部分Objective C在其上。框架应该只导出一个名为mytestsymbol的符号。要做到这一点,我创建一个只包含此行导出的符号文件:如何剥离Cocoa Touch框架

_mytestsymbol 

我再告诉链接使用此文件通过将其添加到“导出符号文件”入口“生成设置/链接”在Xcode中。

在C代码而言,mytestsymbol看起来是这样的:

void mytestsymbol(void) 
{ 
    start_the_whole_shebang(); 
} 

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

在Xcode中检查Cocoa Touch框架的剥离选项时,我可以看到默认情况下这只是设置为“调试符号”,而在构建应用程序时默认设置为“所有符号”。所以我将我的框架的“Strip style”模式更改为“All symbols”,并尝试对其进行存档。

但是,这也行不通。

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

然后符号列表如下:现在strip归档项目时将返回以下错误。这些都是我的框架从其他框架导入的所有符号,例如来自C运行库的东西,如printf,fopen等,但也来自Apple框架如CFBundleCopyBundleURL等。

所以我想我得到这个错误,因为strip试图去掉这些符号,但这当然是禁止的,因为这些是我的框架所需要的。

那么我该如何告诉Xcode去掉只有由我的框架定义的全局符号(mytestsymbol除外),而不是其他任何从其他框架导入的符号?目前,根本没有可能为Cocoa Touch Frameworks设置剥离样式为“所有符号”。每当这个设置为“所有符号”,strip(由Xcode中调用)始终返回以下错误:

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

请注意,我说的只是剥离全局C符号。我知道Objective C不能像C一样剥离,但对我来说没问题。我真的只关心C符号。我希望除去以外的所有C全局变量,除了这个符号名为mytestsymbol

任何想法?

回答

3

要回答我自己的问题:因为引用外部符号(如printf)的可重定位动态库(Cocoa Touch Frameworks基本上)需要间接符号表,因此不可能在Cocoa Touch Frameworks中使用带样式“所有符号”如果“Strip Style”设置为“All Symbols”,则不在此处。

因此,“条样式”应简单地设置为“非全局符号”。这里的命名有点令人困惑,因为“非全局符号”听起来好像strip在上面的代码中没有去掉像mytestsymbol这样的符号(因为它是一个全局符号),但实际上它剥离了它。因此,只需使用“非全局符号”条形式即可完美实现。