【问题标题】:Why GCC --gc-sections and -ffunction-sections is not working? (cmake build)为什么 GCC --gc-sections 和 -ffunction-sections 不起作用? (cmake构建)
【发布时间】:2019-10-10 13:01:47
【问题描述】:

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

可能我监督了一些意外的参考!?
检查已经使用这个非常好的方法: GCC --gc-sections and finding symbol dependencies 与 /DISCARD/ 在链接描述文件中。没有成功。没有引用我未使用的函数。

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

【问题讨论】:

    标签: c++ c gcc cmake ld


    【解决方案1】:

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

    我正在使用 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 目标属性显式标记。

    此策略的OLD 行为是始终使用附加的 链接可执行文件时的链接标志,无论 :prop_tgt:ENABLE_EXPORTS 目标属性。

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

    此策略是在 CMake 版本 3.4 中引入的。不像大多数 政策,CMake 版本 |发布| not 默认情况下会发出警告 未设置策略,仅使用旧行为。见文档 :variable:CMAKE_POLICY_WARNING_CMP0065 <CMAKE_POLICY_WARNING_CMP<NNNN>> 变量来控制警告。

    要摆脱大部分不必要的-rdynamic CMakeLists.txt,只需添加cmake_policy(SET CMP0065 NEW)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-15
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多