为什么 GCC --gc-sections 和 -ffunction-sections 不起作用?(cmake 构建)

Nor*_*rtM 2 c c++ gcc cmake ld

我想知道为什么 GCC 编译器标志 -ffunction-sections 和链接器标志 --gc-sections 不消除不必要的响应。来自我最终可执行文件的未引用符号/函数代码。为什么它不像 GCC 文档中的预期和描述的那样工作?

可能我监督了一些意外的参考!?
检查已经使用这个非常好的方法: GCC --gc-sections 并在链接描述文件中使用 /DISCARD/查找符号依赖项。没有成功。没有提到我未使用的功能。

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

Nor*_*rtM 6

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

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

另请参阅:`-rdynamic` 究竟做了什么以及什么时候需要它?

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

CMP0065

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

由于历史原因,CMake 3.3 及以下版本总是在某些平台上链接可执行文件,并带有诸如-rdynamic从可执行文件导出符号以供它们可能通过dlopen. CMake 3.4 及更高版本更喜欢仅对显式标记为 :prop_tgt: ENABLE_EXPORTStarget 属性的可执行文件执行此操作。

OLD此策略的行为是在链接可执行文件时始终使用附加链接标志,而不管 :prop_tgt:ENABLE_EXPORTS目标属性的值如何。

NEW如果 :prop_tgt:ENABLE_EXPORTS 目标属性设置为,则此策略的行为是仅在链接可执行文件时使用附加链接标志True

此策略是在 CMake 3.4 版中引入的。与大多数策略不同,CMake 版本 |release| 默认情况下,如果未设置此政策并仅使用 OLD 行为,则不会发出警告。请参阅 :variable:CMAKE_POLICY_WARNING_CMP0065 <CMAKE_POLICY_WARNING_CMP<NNNN>>变量的文档以控制警告。

要摆脱最不必要的-rdynamicCMakeLists.txt 只需添加cmake_policy(SET CMP0065 NEW)