У меня есть проект, работающий на процессоре ARM Cortex-M4, где я пытаюсь включить функцию оптимизации времени компоновки 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 и отладки хорошо работать вместе?
Изменить: забыл включить информацию о gcc. Я использую GNU ARM Embedded Toolchain, и тест проводился на версиях 5.4-2016q2 и 5.4-2016кв3.
-flto
и-g
несовместимы, а Gold сохраняет разделы DWARF с--gc-sections
. Однако традиционный компоновщик BFD этого не делает, но для предотвращения удаления можно использовать сценарий компоновщика. - person alecov   schedule 07.01.2019