2013-01-10 251 views
3

我在我的x86 Ubuntu12.04 linux上安装了ARM交叉编译器工具链。ARM交叉编译

现在我有arm-linux-gnueabi-gcc交叉编译器。

我已经编写简单的Hello World程序如下

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

和我过编译使用

ARM-Linux的gnueabi-GCC -oa交流-static

的结果,这个方案编译好的二进制文件如下:

$ file a a:ELF 32位LSB可执行文件,ARM,版本1(SYSV),静态格式化,用于GNU/Linux 2.6.31,不可剥离

如果我对QEMU 我的debian ARM运行Linux此二进制它说“非法指令”

,但如果我编译用gcc相同的源代码在我的手臂Debian的Linux操作系统,它运行良好。

两个二进制文件的结果是一样的。 我的交叉编译的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

您可以运行readelf命令以确定交叉编译器所针对的ARM架构吗?我们需要看看Qemu是否支持这个目标。

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

此外,您可以检查模拟系统中的输出dmesg。它应该包含对非法指令的描述。

此外,您可以在调试器中运行您的程序以查看哪个指令失败。

+0

我想我的交叉编译器maded ARMv7二进制文件,但我的QEMU模拟ARMv5 ...感谢您的帮助! – daehee

+0

你能告诉我如何将交叉编译的二进制版本更改为ARMv5,或者如何用QEMU模拟ARMv7 CPU?或者参考我的一些文档? – daehee

+0

如果你想瞄准armv5,除非你的工具链支持multilib,否则你应该使用另一个工具链。 –