4

我的 c/obj-c 代码(一个用 clang 构建的 iOS 应用程序)有一些被#ifdefs. 我想确保从这些函数调用而不是从其他函数调用的代码(死代码)在链接时被剥离(消除)。我试过:

  1. 在应该消除的函数中添加本地文字 char[];strings在可执行文件上运行时,该字符串仍然可见。
  2. 添加一个应该被淘汰的功能;运行字符串时,函数名称仍然可见。

在你问之前,我正在为发布而构建,并且所有剥离设置(显然包括死代码剥离)都已启用。

这个问题并不是真正的 xcode/apple/iOS 特定的;我认为答案在任何 POSIX 开发平台上都应该几乎相同。

4

1 回答 1

2

(编辑)

在 binutils 中,ld可以--gc-sections选择在对象级别执行您想要的部分。你有几个选择:

  • 使用gcc's flags-ffunction-sections并将-fdata-sections每个符号隔离到自己的部分,然后使用--gc-sections;

  • 所有要删除的候选者放入一个单独的文件中,链接器将能够剥离整个部分;

  • 反汇编生成的二进制文件,删除死代码,再次汇编;

  • 使用strip适当-N的选项从符号表中丢弃有问题的符号 - 这会将代码和数据保留在那里,但不会显示在符号表中。

于 2012-11-19T23:16:51.113 回答