簡體   English   中英

鏈接到ELF時,GCC輸出目標文件中的行號未保留

[英]Line numbers in GCC output object file not preserved when linking to ELF

我正在嘗試為帶有符號和相關行號的ARM建立一個基本項目,以便當它在QEMU中運行時,可以從GDB Multiarch輕松調試該項目。

我有兩個文件,一個C源文件和一些程序集。 在此示例中,它們非常簡單:

cmain.c

int add_numbers(int a, int b) {
    return a + b;
}

int cmain() {
    int a = 3;
    int b = 4;
    int c = add_numbers(a, b);
}

電源:

.section .init
.global _start
_start:
    .extern cmain
    mov sp, #0x8000
    bl cmain

此外,這是鏈接器文件kernel.ld

SECTIONS {
    .init 0x8000 : {
        *(.init)
    }

    .text : {
        *(.text)
    }

    .data : {
        *(.data)
        *(.bss)
        *(.rodata*)
        *(.COMMON)
    }

    /DISCARD/ : {
        *(*)
    }
}

然后,使用以下shell腳本使用調試符號構建這些項目。 簡而言之,它將文件匯編並編譯為目標文件,然后將它們鏈接為ELF,並將目標文件鏈接為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) }

(將它們全部添加都可以。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM