arm開發板 Illegal instruction

轉自:www.cnblogs.com/leaven/archive/2010/10/11/1848138.html

4.3.3這個編譯器是帶EABI的,也就是說具有突出的浮點預算性能,就是Float Point Performance,它使用Vector Float Point(矢量浮點),因此可以極大提高涉及到浮點運算的程序 。而現在手頭既有6410又有2410,這個EABI對這兩個處理器編譯出來的程序有什麼不同麼?

一、預先了解它會做什麼首先我們就先弄清楚它是什麼:

arm-linux-gcc --help 提示中有一個值得注意:

-print-libgcc-file-name  Display the name of the compiler's companion library

這個告訴我們編譯器使用的是哪個庫,執行結果如下:從中我們可以知道其使用的是mv4t版本的庫,其實在/usr/local/arm/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/目錄還有一套其它版本的庫,

arm-linux-gcc -print-libgcc-file-name
/usr/local/arm/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a

 

arm-none-linux-gnueabi-gcc  -print-libgcc-file-name

/usr/local/arm/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/libgcc.a

 

執行下面命令可以看到編譯器會搜索的目錄,從結果可以看到既會搜索mv4t版本也會搜索更高版本的庫。

arm-linux-gcc -print-search-dirs

 

注意:到編譯器目錄/usr/local/arm/4.3.3/bin/ 我們看一下,發現有如下文件,它們是什麼關係?
a.   arm-none-linux-gnueabi-gcc-4.3.3
   arm-none-linux-gnueabi-gcc-4.3.3 與 arm-none-linux-gnueabi-gcc 的內容完全相同

b.   arm-none-linux-gnueabi-gcc

c.   arm-none-linux-gnueabi-g++

A.   arm-linux-g++

#!/bin/sh
arm-none-linux-gnueabi-g++ -march=armv4t $* 

B.   arm-linux-gcc 是一個腳本:

#!/bin/sh
arm-none-linux-gnueabi-gcc -march=armv4t $*

C.   arm-linux-gcc-4.3.3

#!/bin/sh
arm-none-linux-gnueabi-gcc-4.3.3 -march=armv4t $*

 

二、有了基本瞭解,再瞭解一下我們的處理器,兩個處理器的架構區別:

S3C2410/S3C2440,是ARM920T的核心,架構指令是armv4t

S3C6410 ARM1176JZF-S核心,是armv6架構 :ARM11系列微處理器內核(ARM1156T2-S內核、ARM1156T2F-S內核ARM1176JZ-S內核和ARM11JZF-S內核)

所以如果要編譯給6410使用可以改爲: -march=armv6  -mcpu=arm1176jzf-s  或者

        -march=armv6  -mcpu=arm1176jzf-s -mfloat-abi=softfp -mfpu=vfp $*   (使用VFP)

   我們可以用arm-linux-gcc  --target-help命令查看編譯器支持的處理器及架構

 

三、問題和程序編譯:

如果應用程序出現 Illegal instruction 錯誤不能執行等類似問題,一種原因是我們文件系統的庫選錯了(或者是mv4t或者是更高版本庫),另一種原因就是編譯的時候編譯成了另外版本的應用程序。也許有其他版本的編譯器默認庫是高版本庫,那麼我們需要-march=armv4t 之類參數來指定。或者直接做個arm-linux-gcc腳本:

exec arm-none-linux-gnueabi-gcc -march=armv4t $*

同樣可以解決問題,至於將應用程序編譯成靜態庫去解決這個問題,好像是沒有這個必要了。

網上有解決編譯busybox問題的方法:

-----------------http://www.arm9home.net/simple/index.php?t2986.html

在busybox的Makefile裏面
將ARCH ?= $(SUBARCH)
修改爲ARCH ?= armv4t
我看好多資料是將其修改爲
ARCH ?= arm
這樣是不行的
2440內核使用的是arm920t的內核
就是armv4t體系
修改了效果是一樣的

-----------------

 

四、遺留問題,通過執行 arm-linux-gcc –dumpspecs  命令可以看到很多有用的信息,如指定軟硬浮點,指定處理器。以及怎麼樣來製作一個優化的編譯器都是值得進一步研究的


在編譯時,添加參數-march=armv4t $*,程序運行正常。

發佈了69 篇原創文章 · 獲贊 46 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章