为什么在使用cmake构建时,GCC的--gc-sections和-ffunction-sections没有起作用?

6
我想知道为什么 GCC 编译器标志 -ffunction-sections 和链接器标志 --gc-sections 没有从我的最终可执行文件中删除不必要的、未被引用的符号/函数代码。
为什么它没有按照期望和 GCC 文档中描述的那样工作呢?
可能是我忽略了一些意外的引用!?
已经使用这种非常好的方法进行了检查: GCC --gc-sections and finding symbol dependencies,并在链接器脚本中使用 /DISCARD/。但没有成功。我的未使用函数中没有任何引用。
没有自动消除死代码的机会吗?为什么?
1个回答

10
答案非常简单(在我的情况下):
我正在使用CMake构建我的项目,并且它正在插入标志 -rdynamic !据我所知, -rdynamic --gc-sections 选项的组合在GCC文档中没有提到。应该有这样的警告:-rdynamic使--gc-sections无用,因为所有符号都被隐式引用。
另请参见: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目标属性设置为True时,在链接可执行文件时使用附加链接标志。
此策略引入了CMake版本3.4。与大多数策略不同,CMake版本| release |默认情况下不发出警告,当未设置此策略并仅使用OLD行为时,仅使用文档中的CMAKE_POLICY_WARNING_CMP0065变量控制警告。
要摆脱大部分不必要的-rdynamic,只需在CMakeLists.txt中添加cmake_policy(SET CMP0065 NEW)即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接