【问题标题】:GCC --gc-sections and finding symbol dependenciesGCC --gc-sections 并查找符号依赖项
【发布时间】:2014-07-09 09:06:27
【问题描述】:

我正在尝试减小我的 elf 可执行文件的大小。我正在使用-ffunction-sections -fdata-sections 进行编译并与-gc-sections 链接,但似乎一些我认为未使用的符号没有被丢弃。

我可以运行 GNU 工具链中的某些命令来找出正在使用哪些符号以及在哪里使用?

  • 工具链:GNU arm-none-eabi
  • 平台:Cortex-M4
  • 语言:C++

这是我的典型构建标志:

编译:arm-none-eabi-g++.exe -Wall -O3 -mthumb -std=c++11 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -fsingle-precision-constant -ffunction-sections -fdata-sections

链接:arm-none-eabi-g++.exe -static -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Wl,-gc-sections -Wl,-T"LinkerScript.ld

感谢您的帮助。

【问题讨论】:

标签: c++ gcc embedded thumb


【解决方案1】:

您可以尝试链接器选项-Wl,--trace-symbol=<symbol_name>。它将显示在输出中定义符号的位置以及使用符号的位置。

【讨论】:

    【解决方案2】:

    我找不到显示符号依赖项的命令。但是,我能够通过使用以下技术获得所需的信息:

    • 将相关符号添加到链接描述文件的/DISCARD/ 部分。这将输出一条错误消息,显示哪个符号正在使用它。它看起来像这样:<symbol0>' referenced in section '<symbol1>' of <lib0.a file path>(<object0 file path>): defined in discarded section '<symbol0>' of <lib1.a file path>(object1 file path>)
    • 继续将这些消息中的符号添加到调用堆栈的 /DISCARD/ 部分,直到找到问题的根源。

    对我来说,问题的根源是有一个从另一个继承的类。这创建了一个虚拟表,编译器无法删除虚拟表中引用的死代码。

    经验教训:如果您想减少代码大小并仍然使用 C++,请不要使用继承。 GNU 工具链曾经有一个-fvtable-gc 开关来帮助解决这个问题,但它在前一段时间被删除了。我将重构我的代码以解决我的具体问题。

    【讨论】:

    • 嗨@Verax,你的方法看起来很有前途。我在应用它时遇到问题,此部分定义的外观如何?
    • @TorstenRobitzki 示例:/DISCARD/ : { *(.ARM.extab*) *(.ARM.exidx*) }
    • 使用--verbose-Wl,--verbose 来检索默认链接器脚本,将其与-T 一起使用并在顶部添加您的/DISCARD/ 指令,否则可能无法正常工作。
    【解决方案3】:

    创建带有交叉引用输出的链接器映射文件:

    -Wl,-Map=output.map -Wl,--cref

    【讨论】:

    • 谢谢,这很有帮助,但并不能完全满足我的期望。它将符号交叉引用到目标文件,但没有给我一个实际的符号到符号交叉引用。我试图弄清楚为什么我的一些函数在没有希望被调用时没有被丢弃。有什么建议吗?
    • 链接器各不相同,但我认为这与 GNU ld 中的一样好。如果在包含使用符号的目标模块中定义了未使用的函数,则必须链接整个目标模块。一些链接器可以使用跨模块优化从对象模块中删除未使用的代码 - 我不确定 GNU 链接器。
    • 按照链接线程的建议,您尝试过-dead-strip-why-live=*name* 吗?
    • @MattMcNabb 我检查了那些,它们不存在于我的工具链中。它们是 Mac 独有的功能。
    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2016-05-24
    • 2011-02-12
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多