錯誤Illegal instruction 的解決方法
Illegal instruction 的解決方法
最新解決方法:
把/usr/local/arm/compiler/arm-none-linux-gnueabi/libc/armv4t/lib目錄(也就是你的編譯器的庫目錄)下
的所有檔案拷貝到目標板子的根目錄的lib目錄下就好了。
這樣無論你的hello是動態編譯還是靜態編譯,跑起來都不會有Illegal instruction的問題。
////////////////////////////////
老的解決方法:
開發板配置: ARM9 + linux-3.6.30
編譯器:arm-linux-4.3.2
在移植好jffs2檔案系統以後,當然想寫個hello world 來驗證一下自己的成果了。好,開始:
1.
#vi hello.c
#include <stdio.h>
int main(void)
{
printf("welcome to my rootfs!/n");
return 0;
}
#arm-linux-gcc –o hello hello.c
2.把hello複製到用來製作檔案系統的資料夾,製作檔案系統rootfs.jffs2,下載執行,開發板能夠成功啟動,能夠出現shell互動介面。這點肯定地說明busybox是沒有問題的。執行hello
./hello 出現:
Illegal instruction
從網上找了很多資料,大部分把責任歸於EABI,但我想想,既然kernel
雖然他還是把問題歸咎於EABI,但是卻給我指點了解決問題的方向。
既然busybox(這裡的busybox是指編譯busybox-1.15.2生成的busybox二進位制檔案)能夠成功執行,hello不能執行,那就看看他們的區別:
#file buxybox
busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV),
statically
#file hello
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
這時候恍然大悟了,hello在ram+linux系統上找不到執行所需的動態庫,所以Illegal instruction。重新編譯hello.c
#gcc –static –o hello hello.c
#file hello
hello_static: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.14, not stripped
重新制作jffs2檔案系統,下載執行:
#hello 出現
welcome to my rootfs!
完!
現在EABI已經開始在嵌入式中流行起來,確保軟體的EABI匹配性,應該注意下面幾點:
1.編譯kernel的時候要選上EABI。
2.交叉編譯的所有的軟體都要用支援EABI的編譯器(例如arm-linux-4.3.2)來編譯。