2013-01-10 3 views
3

내 x86 Ubuntu12.04 Linux에 ARM 크로스 컴파일러 툴 체인을 설치했습니다.ARM 크로스 컴파일

이제 arm-linux-gnueabi-gcc 크로스 컴파일러가 있습니다.

#include <stdio.h> 
int main(){ 
    printf("hello world\n"); 
    return 0; 
} 

를 따라 내가

의 결과 -static

팔 - 리눅스 - gnueabi-GCC -OA 교류를 사용하여이 프로그램을 컴파일 교차으로

나는 간단한 인사 세계 프로그램을 코딩 한 컴파일 된 바이너리는 다음과 같습니다.

$ 파일 a a : ELF 32 비트 LSB 실행 파일, 정적으로 줄이 바뀐 ARM, 버전 1 (SYSV), GNU/Linux 용 내가 QEMU 내 ARM의 데비안 리눅스에서이 바이너리를 실행하면 2.6.31은, 그것은 '잘못된 명령'

라고하지만

을 제거하지 내 ARM의 데비안 리눅스에 GCC와 같은 소스 코드를 컴파일하는 경우, 그것을 잘 실행됩니다.

두 바이너리의 파일 결과는 같습니다. 내 상호 컴파일 된 ARM 바이너리에 어떤 문제가 있습니까?

미리 감사드립니다.

[email protected]:/var/www$ arm-linux-gnueabi-readelf --file-header --arch-specific a 
ELF Header: 
    Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF32 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        EXEC (Executable file) 
    Machine:       ARM 
    Version:       0x1 
    Entry point address:    0x8881 
    Start of program headers:   52 (bytes into file) 
    Start of section headers:   368052 (bytes into file) 
    Flags:        0x5000002, has entry point, Version5 EABI 
    Size of this header:    52 (bytes) 
    Size of program headers:   32 (bytes) 
     Number of program headers:   7 
    Size of section headers:   40 (bytes) 
    Number of section headers:   30 
    Section header string table index: 27 
Attribute Section: aeabi 
File Attributes 
    Tag_CPU_name: "7-A" 
    Tag_CPU_arch: v7 
    Tag_CPU_arch_profile: Application 
    Tag_ARM_ISA_use: Yes 
    Tag_THUMB_ISA_use: Thumb-2 
    Tag_FP_arch: VFPv3-D16 
    Tag_ABI_PCS_wchar_t: 4 
    Tag_ABI_FP_denormal: Needed 
    Tag_ABI_FP_exceptions: Needed 
    Tag_ABI_FP_number_model: IEEE 754 
    Tag_ABI_align_needed: 8-byte 
    Tag_ABI_align_preserved: 8-byte, except leaf SP 
    Tag_ABI_enum_size: int 
    Tag_ABI_HardFP_use: SP and DP 
    Tag_CPU_unaligned_access: v6 
    Tag_DIV_use: Not allowed 

답변

4

크로스 컴파일러가 목표로하는 ARM 아키텍처를 결정하기 위해 readelf 명령을 실행할 수 있습니까? 이 대상이 Qemu에 의해 지원되는지 확인해야합니다.

arm-linux-gnueabi-readelf --file-header --arch-specific a 

또한, 당신은 당신의 에뮬레이션 시스템에 dmesg의 출력을 확인할 수 있습니다. 불법적 인 명령에 대한 설명을 포함해야합니다.

또한 디버거에서 프로그램을 실행하여 intruction이 실패한 것을 확인할 수 있습니다.

+0

제 크로스 컴파일러가 ARMv7 바이너리를 maded했지만 제 QEMU가 ARMv5를 에뮬레이트하고 있다고 생각합니다. 도움을 주셔서 감사합니다! – daehee

+0

크로스 컴파일 된 이진 버전을 ARMv5로 변경하는 방법 또는 QEMU로 ARMv7 CPU를 에뮬레이트하는 방법을 알려주시겠습니까 ?? 또는 일부 문서를 참조하십시오. – daehee

+0

armv5를 타겟으로하고 싶다면 툴체인이 멀티 링크를 지원하지 않는 한 다른 툴체인을 사용해야합니다. –