Я пытаюсь создать базовый проект для 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 и копирует в 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 мог ее пройти?