1

我正在使用 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 的偏移量。

我怀疑我误解了什么,因为我在谷歌上找不到任何有同样困难的人。

4

1 回答 1

1

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

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

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

于 2012-11-20T07:53:11.473 回答