【问题标题】:how to disable C++ dead code stripping in xcode如何在 xcode 中禁用 C++ 死代码剥离
【发布时间】:2013-04-30 07:50:34
【问题描述】:

我正在尝试为我的 C++ xcode 应用程序从几个静态库(我自己的库)中链接所有未引用的符号。我已经尝试了所有与“strip”相关的属性(通过搜索“strip”的属性),但是未引用的符号,特别是类,没有链接。

我也尝试了 -r 链接器标志,但链接器只抱怨: 'ld: -r 和 -dead_strip 不能一起使用'

我尝试将“-no_dead_strip”添加到链接器标志,但链接器只是告诉我 '-no_dead_strip' 被忽略。

我使用“Apple LLVM”和“LLVM GCC”得到相同的结果。

所以,我的问题是:我应该使用什么链接器标志或目标属性来关闭所有死代码剥离并强制链接未引用的类?

【问题讨论】:

  • 或许可以试试--whole-archive 链接器标志?
  • Android 的 NDK 在其“本机粘合”(静态库)中包含一个名为 app_dummy() 的空函数,该函数没有实现。从客户端调用它(链接到提到的库)显然可以防止在该编译单元中剥离符号。我一直在寻找更优雅的方法,但似乎没有。

标签: c++ xcode


【解决方案1】:

标准链接机制 - 即使用 -l 选项链接 .a 文件将智能地过滤掉未使用的目标文件,因此生成的二进制文件中不存在符号的原因是它们实际上并没有链接。

如果您想从一个存档中获取所有符号,您可以使用标志:-force_load libraryarchive,使用如下:-Wl,-force_load,libfoobar.a 其中libfoobar.a 是您要从中获取所有符号的存档。

为了从所有档案中获取所有符号,您应该使用链接器标志:-all_load,或者如果您从gcc/clang 驱动它,则使用标志-Wl,-all_load

不过,它会生成可怕的符号表!

【讨论】:

  • 使用“死代码剥离”== 否和“不要死剥离初始化和条款”== 是的,它不起作用。但是当我添加“-all_load”链接器标志时,一切都很完美。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多