Nor*_*rtM 2 c c++ gcc cmake ld
我想知道为什么 GCC 编译器标志 -ffunction-sections 和链接器标志 --gc-sections 不消除不必要的响应。来自我最终可执行文件的未引用符号/函数代码。为什么它不像 GCC 文档中的预期和描述的那样工作?
可能我监督了一些意外的参考!?
检查已经使用这个非常好的方法:
GCC --gc-sections 并在链接描述文件中使用 /DISCARD/查找符号依赖项。没有成功。没有提到我未使用的功能。
没有机会自动消除死代码!?为什么 ???
答案很简单(就我而言):
我正在使用 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)
| 归档时间: |
|
| 查看次数: |
2342 次 |
| 最近记录: |