2016-11-22 13 views
4

gcc 링크 시간 최적화 (LTO) 기능을 포함하려는 ARM Cortex-M4 프로세서에서 실행중인 프로젝트가 있습니다. gcc LTO가 디버깅 기호를 제거합니다.

현재 내 컴파일 및 링크 플래그는 다음과 같습니다

CFLAGS = -ggdb -ffunction-sections -Og 
LDFLAGS = -Wl,-gc-sections 

모든 이들 플래그와 함께 잘 작동 내가 올바르게 프로젝트를 디버깅 할 수 있어요.

그런 다음 CFLAGS에 -flto을 추가하려고했습니다. 프로그램이 정상적으로 작동하지만 gdb가 디버깅 심볼이 누락되었다고 불평하면서 프로젝트를 더 이상 디버깅 할 수 없습니다.

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 섹션 (LTO 활성화와 함께) ELF 파일에 objdump -g을 실행하면 다음과 같은 출력을 제공합니다. 프로젝트 설정으로 돌아가서 CFLAGS에서 -flto 만 제거하면 문제가 해결됩니다. LTO가없는 ELF 파일의 objdump -g은 이제 .debug_info 섹션을 보여주고 내 프로젝트의 함수에 대한 적절한 참조로 채워지고 디버깅은 다시 정상적으로 작동합니다.

LTO 및 디버그 기호를 함께 사용하여 잘 재생하려면 어떻게해야합니까?

편집 : 내 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

을 찾을 수 있습니다 "-g로 -flto 결합은 현재 실험과 예상 예기치 않은 결과가 발생할 수 있습니다."

-flto를 사용하면 -g가 무시됩니다.