【问题标题】:How to strip Cocoa Touch Frameworks如何剥离 Cocoa Touch 框架
【发布时间】: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 运行时的东西,如 printffopen 等,还有来自 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


    【解决方案1】:

    回答我自己的问题:不可能在 Cocoa Touch 框架中使用条形样式“所有符号”,因为引用外部符号(如 printf)的可重定位动态库(基本上是 Cocoa Touch 框架)需要一个间接符号表,该表如果“条形样式”设置为“所有符号”,则不会出现。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-01
      • 2015-08-26
      • 1970-01-01
      • 2014-12-14
      • 2019-02-21
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多