我想知道为什么GCC编译器标志--ffunction sections和链接器标志--gc-sections不能消除不必要的resp。我的最终可执行文件中未引用的符号/函数代码。为什么见鬼的它不能像GCC文档中描述的那样工作呢?
可能我看到了一些意想不到的参考!
检查已经使用了这个非常好的方法:在链接器脚本中使用/DISCARD/的GCC --gc-sections and finding symbol dependencies。没有成功。没有对我的未使用函数的引用。
没有机会自动消除死代码!?为什么?
发布于 2019-05-24 07:05:43
答案很简单(在我的例子中):
我正在使用CMake构建我的项目,它插入了标志-rdynamic!
据我所知,在GCC的文档中没有提到-rdynamic和--gc-sections选项的组合。应该会出现这样的警告:
-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目标属性的可执行文件执行此操作。
此策略的目标行为是在链接可执行文件时始终使用附加链接标志,而不考虑:prop_tgt:ENABLE_EXPORTS OLD属性的值。
此策略的目标行为是,如果:prop_tgt:ENABLE_EXPORTS NEW属性设置为True,则仅在链接可执行文件时使用附加链接标志。
此策略是在CMake 3.4版中引入的。与大多数策略不同,CMake version |release|默认情况下不会在未设置此策略时发出警告,而只是使用旧行为。请参阅: variable :CMAKE_POLICY_WARNING_CMP0065 <CMAKE_POLICY_WARNING_CMP<NNNN>>变量的文档以控制警告。
要去掉大部分不必要的-rdynamic CMakeLists.txt,只需添加cmake_policy(SET CMP0065 NEW)
https://stackoverflow.com/questions/56283941
复制相似问题