链接到ELF时,GCC输出对象文件中的行号未保留

链接到ELF时,GCC输出对象文件中的行号未保留,c,gcc,arm,gdb,debug-symbols,C,Gcc,Arm,Gdb,Debug Symbols,我正试图用符号和相关的行号为ARM构建一个基本项目,这样我就可以在GDB Multiarch在QEMU中运行时轻松地调试该项目 我有两个文件,一个C源文件和一些程序集。在本例中,它们非常简单: cmain.c: 主要议题: 此外,下面是链接器文件kernel.ld: 然后,我使用以下shell脚本使用调试符号构建这些项目。简言之,它将这些文件组合并编译成对象文件,然后将它们链接到ELF中,并将objcopies链接到IMG中 rm -r build mkdir -p build arm-non

我正试图用符号和相关的行号为ARM构建一个基本项目,这样我就可以在GDB Multiarch在QEMU中运行时轻松地调试该项目

我有两个文件,一个C源文件和一些程序集。在本例中,它们非常简单:

cmain.c:

主要议题:

此外,下面是链接器文件kernel.ld:

然后,我使用以下shell脚本使用调试符号构建这些项目。简言之,它将这些文件组合并编译成对象文件,然后将它们链接到ELF中,并将objcopies链接到IMG中

rm -r build
mkdir -p build

arm-none-eabi-as -I . main.s -o build/main.o
arm-none-eabi-gcc -ffreestanding -fno-builtin -march=armv7-a -MD -MP -g -c cmain.c -o build/cmain.o

arm-none-eabi-ld build/main.o build/cmain.o -L/usr/lib/gcc/arm-none-eabi/6.3.1/ -lgcc --no-undefined -o build/output.elf -T kernel.ld

arm-none-eabi-objcopy build/output.elf -O binary build/kernel.img --keep-file-symbols
对于GDB调试器单步执行,我需要ELF具有C源代码的行号。(请注意,实际项目中有更多的C文件。)行号显示在C对象文件中,但不在ELF中

$ arm-none-eabi-nm build/cmain.o --line-numbers 
00000000 T add_numbers  /home/aaron/Desktop/arm-mcve/cmain.c:1
00000030 T cmain        /home/aaron/Desktop/arm-mcve/cmain.c:5

$ arm-none-eabi-nm build/output.elf --line-numbers 
00008008 T add_numbers
00008038 T cmain
00008000 T _start

为什么ELF中没有行号信息,我如何添加它以便GDB可以单步执行它?

您的链接器脚本将丢弃包含调试信息的部分。查看默认链接器脚本
arm none eabi ld--verbose
,了解一些想法。您至少需要一些DWARF 2部分:

  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
(添加所有这些选项都应该有效。)

rm -r build
mkdir -p build

arm-none-eabi-as -I . main.s -o build/main.o
arm-none-eabi-gcc -ffreestanding -fno-builtin -march=armv7-a -MD -MP -g -c cmain.c -o build/cmain.o

arm-none-eabi-ld build/main.o build/cmain.o -L/usr/lib/gcc/arm-none-eabi/6.3.1/ -lgcc --no-undefined -o build/output.elf -T kernel.ld

arm-none-eabi-objcopy build/output.elf -O binary build/kernel.img --keep-file-symbols
$ arm-none-eabi-nm build/cmain.o --line-numbers 
00000000 T add_numbers  /home/aaron/Desktop/arm-mcve/cmain.c:1
00000030 T cmain        /home/aaron/Desktop/arm-mcve/cmain.c:5

$ arm-none-eabi-nm build/output.elf --line-numbers 
00008008 T add_numbers
00008038 T cmain
00008000 T _start
  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }