为什么GCC --gc-sections和-ffunction-sections无法正常工作? (cmake版本)

时间:2019-05-23 23:05:43

标签: c++ c gcc cmake ld

我想知道为什么GCC编译器标志-ffunction-sections和链接器标志--gc-sections不能消除不必要的响应。我最终的可执行文件中未引用的符号/功能代码。 为什么在GCC文档中无法正常工作?

可能我已经监督了一些意外的参考!!
检查已经使用过这种非常好的方法: GCC --gc-sections and finding symbol dependencies和/ DISCARD /在链接描述文件中。没有成功没有提及我未使用的功能。

没有机会自动消除无效代码!?为什么???

1 个答案:

答案 0 :(得分:1)

答案很简单(就我而言):

我正在使用CMake来构建我的项目,它正在插入标志-rdynamic
据我所知,-rdynamic--gc-sections选项的组合在GCC文档中没有提到。 应该有这样的警告:
-rdynamic导致--gc-sections的无用bcs。所有符号都被隐式引用。

另请参阅:What exactly does `-rdynamic` do and when exactly is it needed?

当然只有CMake用户会受到此影响...(不知道):

  

CMP0065

     

请勿添加标志以从没有可执行文件的可执行文件中导出符号   :prop_tgt:ENABLE_EXPORTS目标属性。

     

出于历史原因,CMake 3.3及更低版本始终链接可执行文件   在某些带有-rdynamic之类的标志的平台上,可以从   由dlopen加载的任何插件使用的可执行文件。   CMake 3.4及更高版本更喜欢仅对以下可执行文件执行此操作   明确标记为:prop_tgt:ENABLE_EXPORTS目标属性。

     

此政策的OLD行为是始终使用附加   链接可执行文件时的链接标志,无论   :prop_tgt:ENABLE_EXPORTS目标属性。

     

此政策的NEW行为是仅使用附加链接   :prop_tgt:ENABLE_EXPORTS链接可执行文件时标记   target属性设置为True

     

此策略是在CMake 3.4版中引入的。不像大多数   策略,CMake版本|发布|默认情况下, not 不会发出警告   未设置政策,仅使用OLD行为。请参阅   :variable:CMAKE_POLICY_WARNING_CMP0065 <CMAKE_POLICY_WARNING_CMP<NNNN>>变量来控制警告。

要摆脱最不需要的-rdynamic CMakeLists.txt,只需添加cmake_policy(SET CMP0065 NEW)