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 버전에서 테스트가 수행되었습니다.
여기에 관심있는 정보가 있습니다. https://gcc.gnu.org/wiki/early-debug – Pyves
혹시이 사실을 알아 냈습니까? –
아직 없습니다. 새로운 버전의 gcc에서 테스트하지는 않았다. – swineone