У меня есть проект, работающий на процессоре ARM Cortex-M4, где я пытаюсь включить функцию оптимизации времени соединения gcc (LTO).gcc LTO, похоже, отключает отладочные символы
В настоящее время мой компиляции и компоновки флаги:
CFLAGS = -ggdb -ffunction-sections -Og
LDFLAGS = -Wl,-gc-sections
Все отлично работает с этими флагами, и я в состоянии правильно выполнить отладку проекта.
Затем я попытался добавить -flto
в CFLAGS. Хотя программа работает нормально, я больше не могу отлаживать проект, а gdb жалуется на отсутствие символов отладки. Запуск objdump -g
на файл ELF (с поддержкой LTO) дает следующий результат:
xxx.elf: file format elf32-littlearm
Contents of the .debug_frame section:
00000000 0000000c ffffffff CIE
Version: 1
Augmentation: ""
Code alignment factor: 2
Data alignment factor: -4
Return address column: 14
DW_CFA_def_cfa: r13 ofs 0
00000010 00000018 00000000 FDE cie=00000000 pc=08002a3c..08002a88
DW_CFA_advance_loc: 2 to 08002a3e
DW_CFA_def_cfa_offset: 16
DW_CFA_offset: r4 at cfa-16
DW_CFA_offset: r5 at cfa-12
DW_CFA_offset: r6 at cfa-8
DW_CFA_offset: r14 at cfa-4
DW_CFA_nop
0000002c 0000000c ffffffff CIE
Version: 1
Augmentation: ""
Code alignment factor: 2
Data alignment factor: -4
Return address column: 14
DW_CFA_def_cfa: r13 ofs 0
0000003c 0000000c 0000002c FDE cie=0000002c pc=08002a88..08002a98
Примечание недостающее .debug_info
раздел. Возвращаясь к настройкам проекта, и только удаление -flto
из CFLAGS решает проблему. objdump -g
в файле ELF без LTO теперь показывает раздел .debug_info
, заполненный правильными ссылками на функции в моем проекте, и отладка снова прекращается.
Как получить символы LTO и debug, чтобы хорошо играть вместе?
Редактировать: забыли указать мою информацию о gcc. Я использую GNU ARM Embedded Toolchain, и тест проводился на версиях 5.4-2016q2 и 5.4-2016q3.
Информация, которая может быть вам интересна здесь: https://gcc.gnu.org/wiki/early-debug – Pyves
Вы когда-нибудь это понимали? –
Пока нет. Однако я не тестировал новую версию gcc. – swineone