2016-11-22 2 views
4

У меня есть проект, работающий на процессоре 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.

+0

Информация, которая может быть вам интересна здесь: https://gcc.gnu.org/wiki/early-debug – Pyves

+0

Вы когда-нибудь это понимали? –

+0

Пока нет. Однако я не тестировал новую версию gcc. – swineone

ответ

1

Это потому, что gcc не поддерживает объединение -flto с -g.

Вы можете найти детали here

«Объединение -flto с -g в настоящее время экспериментальные и ожидается привести к неожиданным результатам.»

Когда вы используете -flto, -g будет проигнорирован.

Смежные вопросы