1. 程式人生 > >錯誤Illegal instruction 的解決方法

錯誤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

busybox都能正常啟動,那它們都應該是eabi編譯的了,hello也肯定是eabi的,因為他們都是用arm-linux-4.3.2編譯的(編譯核心的時候make menuconfig要選山EABI選項).所以網上大部分資料都不適合解決我遇到的問題。但最終還是找到了一邊能夠幫我解決問題的文章:

雖然他還是把問題歸咎於EABI,但是卻給我指點了解決問題的方向。

既然busybox(這裡的busybox是指編譯busybox-1.15.2生成的busybox二進位制檔案)能夠成功執行,hello不能執行,那就看看他們的區別:

#file buxybox

busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically

linked, for GNU/Linux 2.6.14, stripped

#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

這時候恍然大悟了,helloram+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)來編譯。