MIPS交叉编译错误:非法指令

我想为MIPS机器交叉编译C src,但编译失败。 在目标机器上执行交叉编译的二进制输出“非法指令”。 你能不能让我知道如何编译MIPS机器的C src?

详情如下:

执行“readelf -h host.bin”(host.bin是在HOST机器上运行的二进制程序)输出:

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: Intel 80386 Version: 0x1 Entry point address: 0x8048aac Start of program headers: 52 (bytes into file) Start of section headers: 8628 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 9 Size of section headers: 40 (bytes) Number of section headers: 30 Section header string table index: 27 

执行“readelf -h target.bin”(target.bin是运行在目标机器上的二进制程序)输出:

 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: MIPS R3000 Version: 0x1 Entry point address: 0x403570 Start of program headers: 52 (bytes into file) Start of section headers: 114040 (bytes into file) Flags: 0x5, noreorder, cpic, mips1 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 6 Size of section headers: 40 (bytes) Number of section headers: 23 Section header string table index: 22 

执行“readelf -h cross_compiled.bin”输出(cross_compiled.bin是由目标机器交叉编译的二进制文件):

 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: MIPS R3000 Version: 0x1 Entry point address: 0x400170 Start of program headers: 52 (bytes into file) Start of section headers: 16444 (bytes into file) Flags: 0x1007, noreorder, pic, cpic, o32, mips1 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 5 Size of section headers: 40 (bytes) Number of section headers: 21 Section header string table index: 20 

对于交叉编译,我使用了支持MIPS1交叉编译的buildroot。

我期望cross_compiled.bin在目标机器上正常执行。 但是,在目标机器上执行“cross_compiled.bin”时,输出“非法指令”。

你能不能让我知道如何解决上述问题? 由于我是新手交叉编译,我找不到问题的确切原因。

任何意见将不胜感激。

更新:

在目标上,执行“cat / proc / cpuinfo”输出:

 system type : Broadcom BCM5354 chip rev 3 processor : 0 cpu model : BCM3302 V2.9 BogoMIPS : 237.56 wait instruction : no microsecond timers : yes tlb_entries : 32 extra interrupt vector : no hardware watchpoint : no VCED exceptions : not available VCEI exceptions : not available unaligned_instructions : 1 dcache hits : 0 dcache misses : 0 icache hits : 0 icache misses : 0 instructions : 0 

在目标上,执行“cat / proc / version”输出:

 Linux version 2.4.20 (ronger@ronger-linux.sh.deltagroup.com) (gcc version 3.2.3 with Broadcom modifications) #1 Tue May 22 17:40:19 EDT 2007 

我用于交叉编译的命令行(cross_compiled.bin):

 mipsel-linux-gcc -static -o cross_compiled.bin cross_compiled.c 

cross_compiled.c:

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

由于我的cross_compiled.c非常简单,我相信不存在与使用的库相关的问题。

各种各样的事情都可能造成 我可以从你的帖子看到的一件事是,你的二进制文件和二进制文件之间的ELF标志是不同的。 内核也很旧,你也没有在你自己的buildroot中报告gcc的版本。

我注意到,该芯片组(BCM5354)与DLINK DIR-320和其他版本中使用的相同,正好由OpenWRT支持。 假设你还没有使用OpenWRT作为buildroot,我会再次尝试使用OpenWRT。

相反,您可以从DLINK支持网站下载DLink提供的包含buildroot的GPL源代码,然后尝试使用。 鉴于用于构建目标的内核和gcc的时代以及主干OpenWRT的新颖性,您可能需要尝试查找支持该路由器的最早版本的OpenWRT,或者先尝试使用DLINK构建根。

如果你有几台电脑,你可以同时尝试两个buildroot …

如果这不能解决它,你需要发布更多的信息

我使用mipsel-linux-gcc (版本4.5.3)编译你的hello世界程序。 这是mipsel-linux-objdump -d -S在hello world程序上运行时的输出。 程序在我桌上的一台Broadcom 7425小型机器上运行得很好。

 004002a0 <main>: 4002a0: 27bdffe0 addiu sp,sp,-32 4002a4: afbf001c sw ra,28(sp) 4002a8: afbe0018 sw s8,24(sp) 4002ac: 03a0f021 move s8,sp 4002b0: 3c020040 lui v0,0x40 4002b4: 24444490 addiu a0,v0,17552 4002b8: 0c1000b8 jal 4002e0 <puts> 4002bc: 00000000 nop 4002c0: 00001021 move v0,zero 4002c4: 03c0e821 move sp,s8 4002c8: 8fbf001c lw ra,28(sp) 4002cc: 8fbe0018 lw s8,24(sp) 4002d0: 27bd0020 addiu sp,sp,32 4002d4: 03e00008 jr ra 4002d8: 00000000 nop 4002dc: 00000000 nop 

你拆散的编译器输出应该看起来非常相似。 如果它不请更新您的问题。