轉自: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/sharm-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 或者
我們可以用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 $*,程序運行正常。