【问题标题】:Using compile flag -ffunction-sections with debug symbols使用带有调试符号的编译标志 -ffunction-sections
【发布时间】:2012-11-19 23:14:24
【问题描述】:

我正在使用 gcc 标志 -ffunction-sections 编译一个 C 文件,以将每个函数移动到它自己的部分。汇编程序抛出错误:

job_queue.s:2395: Error: operation combines symbols in different segments

此处给出了第 2395 行的编译器汇编输出:

.section    .debug_ranges,info
.Ldebug_ranges0:
.4byte  .LBB7-.Ltext0

符号 LBB7 位于名为“.text.add_event_handler”的函数(以及该部分)中 符号 Ltext0 位于(否则为空)部分中,名为:“.text”

GCC --version 给出:

pic30-elf-gcc.exe (GCC) 4.0.3 (dsPIC30, Microchip v3_30) (B) Build date: Jun 29 2011

如果我使用编译器标志 -g0(关闭调试信息),一切都会编译并完美运行。

我的问题: 这个 GCC 输出明显错误吗?在我看来,GCC 应该从 .add_even_handler 部分而不是 .text 部分的开头计算符号 LBB7 的偏移量。

我怀疑我理解错了,因为我在 Google 上找不到遇到同样困难的人。

【问题讨论】:

  • 你尝试过更新的 gcc 吗?似乎在这里工作正常,但我在 x86 和 gcc 4.4.5 上......不知道哪个更重要;)

标签: gcc assembly debug-symbols sections


【解决方案1】:

GCC 输出肯定是错误的。也许它已在较新的 GCC 版本中修复。如果您无法升级编译器,请尝试使用-gdwarf-2 进行编译,或者使用-gdwarf-2 -gstrict-dwarf 进行编译(对于-gstrict-dwarf,您也必须升级编译器)。

此选项的作用是指示 GCC 生成(严格)DWARF2,它不包括在 DWARF3 中引入的非连续地址范围支持。

当然,这可能会降低调试信息的质量,YMMV。

【讨论】:

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