Номера строк в выходном объектном файле GCC не сохраняются при связывании с ELF - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь построить базовый проект для ARM с символами и соответствующими номерами строк, чтобы я мог легко отладить проект из GDB Multiarch, пока он выполняется в QEMU.

У меня есть два файла, исходный файл 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);
}

main.s:

.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/ : {
        *(*)
    }
}

Затем я строю эти проекты с помощью символов отладки, используя следующий сценарий оболочки. Короче говоря, он собирает и компилирует файлы в объектные файлы, затем связывает их в 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 мог пройти через нее?

1 Ответ

3 голосов
/ 15 марта 2019

Ваш скрипт компоновщика отбрасывает разделы с отладочной информацией.Посмотрите на скрипт компоновщика по умолчанию 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) }

(Добавление всех из них должно работать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...