2012-11-19 2 views
1

모든 기능을 자체 섹션으로 이동하려면 gcc 플래그 -ffunction-sections을 사용하여 C 파일을 컴파일합니다. 어셈블러는 오류를 던지고있다 : 라인 2395에서디버그 기호로 컴파일 플래그 -ffunction-sections 사용

job_queue.s:2395: Error: operation combines symbols in different segments 

컴파일러의 어셈블리 출력이 여기에 주어집니다 :

.section .debug_ranges,info 
.Ldebug_ranges0: 
.4byte .LBB7-.Ltext0 

심볼 LBB7가 "는 .text라는 기능 (및 섹션)에 있습니다. add_event_handler " 기호 Ltext0이라는 이름의 (그렇지 않으면 빈) 섹션에"는 .text는 "

GCC의 --version을 제공합니다

pic30-elf-gcc.exe (GCC) 4.0.3 (dsPIC30, Microchip v3_30) (B) Build date: Jun 29 2011 

컴파일러 플래그 -g0 (디버그 정보를 끄기 위해)을 사용하면 모든 것이 완벽하게 컴파일되고 실행됩니다.

내 질문 : 이 GCC 출력이 분명히 잘못 되었습니까? GCC는 .text 섹션 대신 .add_even_handler 섹션의 시작 부분에서 LBB7의 오프셋을 계산 했어야합니다.

Google에서 동일한 어려움을 겪고있는 사람을 찾을 수 없어서 내가 오해하고 있다고 생각합니다.

+0

새로운 gcc로 시도 했습니까? 여기서는 괜찮은 것처럼 보이지만, x86 및 gcc 4.4.5 ... 어떤 것이 더 중요한지는 알 수 없습니다.) – Jester

답변

1

GCC 출력이 잘못되었습니다. 아마도 그것은 새로운 GCC 버전에서 수정되었습니다. 컴파일러를 업그레이드 할 수 없으면 -gdwarf-2으로 컴파일하거나 -gdwarf-2 -gstrict-dwarf으로 컴파일하십시오 (-gstrict-dwarf의 경우 컴파일러도 업그레이드해야합니다).

이 옵션의 역할은 GCC가 DWARF3에서 도입 된 비 연속 주소 범위 지원을 포함하지 않는 (엄격한) DWARF2를 생성하도록 지시하는 것입니다.

물론 이것은 디버깅 정보 품질을 다소 떨어 뜨릴 수 있습니다. YMMV.

관련 문제