我想知道为什么GCC编译器标志-ffunction-sections和链接器标志--gc-sections不能消除不必要的响应。我最终的可执行文件中未引用的符号/功能代码。 为什么在GCC文档中无法正常工作?
可能我已经监督了一些意外的参考!!
检查已经使用过这种非常好的方法:
GCC --gc-sections and finding symbol dependencies和/ DISCARD /在链接描述文件中。没有成功没有提及我未使用的功能。
没有机会自动消除无效代码!?为什么???
答案 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)