2013-08-02 2 views
0

각 ELF 파일에서 'objcopy -O 바이너리'를 통해 생성 된 2 개의 바이너리 파일이 있습니다. ELF 파일은 arm-none-linux-gnueabi 툴 체인으로 빌드됩니다. 하나는 linaro gcc 4.6.2이고 다른 하나는 codesourcery gcc 4.6.3입니다.다른 버전의 툴체인에서 생성 된 ELF/2 진 파일 비교

Uboot를 통해 이진 파일을 메모리에로드합니다. Linaro를 사용하여 빌드 된 빌드가 예상대로 실행되는 동안 (아마도 대부분의 경우) Uboot 프롬프트에 오류가 없지만 프로그램이 중단 된 것 같습니다.

각 툴체인의 binutils에서 'arm-none-linux-gnueabi-readelf -S'를 사용하면 주소 오프셋을 제외하고는 파일간에 큰 차이가 없습니다. 대상에서 런타임 디버깅을 시도하기 전에 이런 종류의 상황에서 도움이되는 도구/기술이 있습니까?

감사합니다.

/path/to/cross-compiler/bin/arm-*-*-gcc -Q -v 

그리고 전 처리기 정의 : 두 컴파일러가 함께 내장 된 기본 플래그 비교에

+0

두 컴파일러는 매우 밀접하게 관련되어 있습니다. CodeSourcery에는 Linaro가 사용하지 않기로 선택한 몇 가지 패치가있었습니다. 그것은 아마도 다른 구성 일 것입니다. – ams

답변

1

차이점은 컴파일러 옵션 -munaligned-access로 밝혀졌습니다. Code Sourcery 툴 체인은 ARMv6 이상의 아키텍처에서 기본적으로이 기능을 활성화합니다. http://gcc.gnu.org/gcc-4.7/changes.html

이 코드는 업스트림 gcc에서 4.7 버전으로 나왔지만 코드 소싱 (Code Sourcery)은 도구 체인의 초기에이 지원을 추가했습니다.

이것을 알아 내기 위해 데이터 중단 예외를 추적 한 다음 -save-temps 옵션을 사용하여 범실 파일을 컴파일했습니다. 중간 .s 파일을 비교하면 힌트가 제공됩니다.

1

내가 당신을 조언 할 것은

/path/to/cross-compiler/bin/arm-*-*-gcc -dM -E - < /dev/null 

코드가 리나 GCC의 작품을 사용하여 컴파일하는 이유 사실, 해당 CodeSourcery 하나 않을 때 기본적으로 사용할 수있는 몇 가지 옵션이있을 수 있습니다.