我正在使用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应该计算符号LBB7从.add_even_handler部分的开头而不是.text部分的偏移量。
我怀疑我误解了一些东西,因为我找不到任何人在Google上遇到同样的困难。
答案 0 :(得分:1)
GCC输出肯定是错误的。也许它已在较新的GCC版本中修复。如果您无法升级编译器,请尝试使用-gdwarf-2
进行编译,或者使用-gdwarf-2 -gstrict-dwarf
进行编译(对于-gstrict-dwarf
,您也必须升级编译器。)
此选项的作用是指示GCC生成(严格)DWARF2,它不包括DWARF3中引入的非连续地址范围支持。
当然,这可能会在某种程度上降低调试信息质量,YMMV。