交叉編譯器解(jie)析
時間:2018-09-26 來源(yuan):未知
編譯器:
就是將"一種語(yu)言(通常為高級(ji)語(yu)言)"翻譯為"另一種語(yu)言(通常為低(di)級(ji)語(yu)言)"的(de)程序。一個現代(dai)編(bian)譯器(qi)(qi)的(de)主要(yao)工(gong)作流程:源代(dai)碼 (source code) → 預處理(li)器(qi)(qi) (preprocessor) → 編(bian)譯器(qi)(qi) (compiler) → 目標代(dai)碼 (object code) → 鏈接器(qi)(qi) (Linker) → 可(ke)執(zhi)行程序 (executables) 。
一:什么叫交叉編譯器呢?
在(zai)解釋什么叫交(jiao)叉(cha)編(bian)譯(yi)器(qi)前(qian),我們(men)必須要知道“本(ben)地(di)(di)編(bian)譯(yi)”這個概(gai)念(nian)(nian),在(zai)我們(men)之前(qian)學(xue)習過(guo)得(de)軟件開發中,都屬于本(ben)地(di)(di)編(bian)譯(yi),換而言之就是在(zai)x86平(ping)臺(tai)(tai)下(xia),直接將源(yuan)文件編(bian)譯(yi)出(chu)(chu)來(lai)的程序(xu)(xu),編(bian)譯(yi)出(chu)(chu)來(lai)的程序(xu)(xu)可以在(zai)當前(qian)平(ping)臺(tai)(tai)下(xia)進行運行。在(zai)理解這個概(gai)念(nian)(nian)的前(qian)提(ti)下(xia),我們(men)接下(xia)來(lai)再(zai)來(lai)學(xue)習什么叫交(jiao)叉(cha)編(bian)譯(yi)器(qi)。
而(er)(er)所謂的(de)(de)交叉(cha)(cha)編譯(yi)(yi)器(qi),其實(shi)也(ye)很簡(jian)單,就(jiu)是在(zai)一(yi)種(zhong)平(ping)(ping)臺上(shang)編譯(yi)(yi)出(chu)來的(de)(de)程序,不(bu)在(zai)是放在(zai)自己(ji)的(de)(de)機器(qi)上(shang)去運行,而(er)(er)是放到另(ling)外一(yi)個平(ping)(ping)臺上(shang)去運行,也(ye)就(jiu)是我(wo)們所說的(de)(de)環(huan)境(jing)不(bu)一(yi)樣,而(er)(er)這也(ye)就(jiu)是為什么稱之為交叉(cha)(cha)編譯(yi)(yi)器(qi)的(de)(de)原因,用(yong)英文解(jie)釋,這就(jiu)是所謂的(de)(de)cross。
二:體系結構與操作系統
1,常見的(de)體系結構(gou)有ARM結構(gou)、x86結構(gou)等.
2,常見的(de)操作系(xi)統有linux,windows等.
3,同(tong)一個體系結(jie)構可(ke)(ke)以(yi)(yi)運(yun)(yun)行(xing)不同(tong)操作系統,如x86上可(ke)(ke)以(yi)(yi)運(yun)(yun)行(xing)Linux、Windows等,在ARM上可(ke)(ke)以(yi)(yi)運(yun)(yun)行(xing)Linux、WinCE.
4,同一個操(cao)作系統(tong)可(ke)以(yi)在不(bu)同的體(ti)系結構上(shang)運(yun)行,比如Linux可(ke)以(yi)運(yun)行在x86上(shang),也(ye)可(ke)以(yi)運(yun)行在ARM上(shang).
5.同樣的(de)程(cheng)序(xu)不可(ke)能運行(xing)在(zai)(zai)多個平臺上,比如Windows下應用(yong)程(cheng)序(xu)不能在(zai)(zai)Linux下運行(xing).如果一個應用(yong)程(cheng)序(xu)想(xiang)在(zai)(zai)另(ling)一個平臺上運行(xing),必須使用(yong)針對該平臺的(de)編(bian)譯器,來(lai)重新編(bian)譯該應用(yong)程(cheng)序(xu)的(de)二進(jin)制代(dai)碼,就(jiu)像我們現在(zai)(zai)在(zai)(zai)身邊進(jin)程(cheng)遇(yu)到的(de),如果你(ni)(ni)使用(yong)的(de)是蘋果手(shou)機,下載需要(yao)的(de)app,會提醒(xing)你(ni)(ni)下載適合蘋果版本的(de),而如果你(ni)(ni)使用(yong)的(de)是,那你(ni)(ni)就(jiu)要(yao)選擇androin的(de)應用(yong)程(cheng)序(xu)。
三:使用交叉編譯器的原因
ARM上可(ke)(ke)(ke)以運(yun)行(xing)操作(zuo)系統,所(suo)以用(yong)(yong)戶完全可(ke)(ke)(ke)以將(jiang)ARM當(dang)做計算(suan)機來使用(yong)(yong),理論上也可(ke)(ke)(ke)以在(zai)(zai)ARM上使用(yong)(yong)本地的(de)編(bian)譯(yi)(yi)器來編(bian)譯(yi)(yi)程(cheng)序(xu).但(dan)是(shi)(shi),編(bian)譯(yi)(yi)器在(zai)(zai)編(bian)譯(yi)(yi)程(cheng)序(xu)時,會產生(sheng)大(da)量的(de)中間(jian)文件(jian),這(zhe)會占(zhan)用(yong)(yong)很大(da)的(de)內存(cun)和磁盤空(kong)(kong)間(jian),且對(dui)CPU處理速度要求較高(gao),比如S3C2440A內存(cun)、磁盤空(kong)(kong)間(jian)只(zhi)有幾(ji)十到100多兆(zhao),CPU只(zhi)有400-500MHz,完全達不到編(bian)譯(yi)(yi)程(cheng)序(xu)的(de)要求.所(suo)以,在(zai)(zai)進行(xing)ARM-linux嵌入式開發時必須(xu)在(zai)(zai)PC機(x86結構)上編(bian)譯(yi)(yi)出能(neng)夠運(yun)行(xing)在(zai)(zai)ARM上的(de)程(cheng)序(xu),然(ran)(ran)后再(zai)將(jiang)程(cheng)序(xu)下載到ARM中來運(yun)行(xing).這(zhe)就用(yong)(yong)到了交叉編(bian)譯(yi)(yi)器(當(dang)然(ran)(ran)我(wo)(wo)們也可(ke)(ke)(ke)以從我(wo)(wo)們簡(jian)答(da)的(de)認(ren)識(shi)(shi)下去(qu)認(ren)識(shi)(shi)為什么使用(yong)(yong)交叉編(bian)譯(yi)(yi)器,在(zai)(zai)我(wo)(wo)們平時開發的(de)過程(cheng)中,我(wo)(wo)們多的(de)使用(yong)(yong)的(de)還是(shi)(shi)基于x86的(de)平臺,確切的(de)可(ke)(ke)(ke)以說就是(shi)(shi)我(wo)(wo)們的(de)pc機,因為pc機相(xiang)對(dui)我(wo)(wo)們的(de)開發板而言(yan),資源是(shi)(shi)相(xiang)對(dui)豐富的(de),我(wo)(wo)們可(ke)(ke)(ke)操作(zuo)性較強(qiang))。
如(ru)果要(yao)進行交(jiao)叉編(bian)譯(yi)(yi)(yi),用(yong)戶(hu)需(xu)要(yao)在(zai)主機平臺(tai)上安裝對應的交(jiao)叉編(bian)譯(yi)(yi)(yi)工具鏈(lian)(lian),然(ran)后才能使用(yong)去編(bian)譯(yi)(yi)(yi)源代碼,終生成可(ke)在(zai)目標平臺(tai)上運行的代碼.交(jiao)叉編(bian)譯(yi)(yi)(yi)工具鏈(lian)(lian)可(ke)以(yi)從網上下載,也可(ke)以(yi)自己制作(zuo).但編(bian)譯(yi)(yi)(yi)器不是萬(wan)能的,受版本(ben)限制,編(bian)譯(yi)(yi)(yi)某些程(cheng)序時會(hui)報錯(cuo).常見(jian)的交(jiao)叉編(bian)譯(yi)(yi)(yi)工具鏈(lian)(lian)有:
1,Cross -2.95.3 tar: 該版本較早(zao),除了編譯vivi外一般(ban)不(bu)使用.
2,arm920t-eabi.tgz: 4.1.2版本(ben)的編(bian)譯器(qi),支持(chi)eabi,可以編(bian)譯TX2440A開發板上的所有程序(xu).
3,arm-linux-gcc: 4.3.2版本的編譯器,支持eabi,是(shi)常見的交叉(cha)工(gong)具鏈.
什么是EABI
EABI,Embeded application binary interface,即嵌入式應(ying)用(yong)二進(jin)制接口(kou),是描(miao)述可連接目標代(dai)碼(ma)、庫目標代(dai)碼(ma)、可執(zhi)行(xing)文件影(ying)像、如(ru)何連接、執(zhi)行(xing)和調試以及目標代(dai)碼(ma)生成過程,和c, c++語言(yan)接口(kou)的(de)(de)規(gui)范(fan),是編(bian)(bian)(bian)譯(yi)(yi)連接工具(ju)的(de)(de)基礎(chu)規(gui)范(fan),也是研(yan)究它們工作原理的(de)(de)基礎(chu).簡而(er)言(yan)之,EABI就是一種編(bian)(bian)(bian)譯(yi)(yi)規(gui)范(fan),交叉(cha)編(bian)(bian)(bian)譯(yi)(yi)器在編(bian)(bian)(bian)譯(yi)(yi)時,對于浮(fu)點(dian)運(yun)算會使用(yong)硬浮(fu)點(dian)運(yun)算,提高(gao)了(le)浮(fu)點(dian)運(yun)算的(de)(de)性能,節省了(le)編(bian)(bian)(bian)譯(yi)(yi)時間.
四:交叉編譯工具鏈實例
1、arm-none-eabi-gcc
(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)
用(yong)于編(bian)譯(yi)(yi) ARM 架構的裸(luo)機系統(tong)(包括 ARM Linux 的 boot、kernel,不適用(yong)編(bian)譯(yi)(yi) Linux 應用(yong) Application),一般適合 ARM7、Cortex-M 和 Cortex-R 內核的芯片使用(yong),所以不支(zhi)持那些跟操作(zuo)系統(tong)關(guan)系密切的函(han)數,比如fork(2),他使用(yong)的是 newlib 這個(ge)專用(yong)于嵌入式(shi)系統(tong)的C庫。
2、arm-none-linux-gnueabi-gcc
(ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)
主要用(yong)于(yu)基(ji)于(yu)ARM架(jia)構(gou)的(de)Linux系統,可用(yong)于(yu)編(bian)譯 ARM 架(jia)構(gou)的(de) u-boot、Linux內核(he)、linux應用(yong)等(deng)。arm-none-linux-gnueabi基(ji)于(yu)GCC,使用(yong)Glibc庫,經過 Codesourcery 公(gong)司優(you)(you)化(hua)過推出(chu)的(de)編(bian)譯器。arm-none-linux-gnueabi-xxx 交叉編(bian)譯工具的(de)浮(fu)點運算非常優(you)(you)秀。一般ARM9、ARM11、Cortex-A 內核(he),帶有 Linux 操作系統的(de)會用(yong)到.
3、arm-eabi-gcc
Android ARM 編譯器(qi)
4、armcc
ARM 公(gong)司推出(chu)的(de)編(bian)(bian)譯(yi)工具,功(gong)能和 arm-none-eabi 類(lei)似,可以(yi)編(bian)(bian)譯(yi)裸(luo)機程(cheng)序(xu)(u-boot、kernel),但是不能編(bian)(bian)譯(yi) Linux 應用程(cheng)序(xu)。armcc一般(ban)和ARM開發工具一起,Keil MDK、ADS、RVDS和DS-5中的(de)編(bian)(bian)譯(yi)器都是armcc,所以(yi) armcc 編(bian)(bian)譯(yi)器都是收(shou)費的(de).
5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc
arm-none-uclinuxeabi 用于uCLinux,使用Glibc.
arm-none-symbianelf 用于(yu)symbian,沒用過,不知(zhi)道C庫是(shi)什么(me) .
五:安裝交叉工具鏈實例
1,將arm-cortex_a8-linux-gnueabi.tar.bz2交(jiao)叉編譯器壓縮包(bao)復(fu)制到虛(xu)擬機主(zhu)目錄;
2,解(jie)壓arm-cortex_a8-linux-gnueabi.tar.bz2壓縮包;
tar xvf arm-cortex_a8-linux-gnueabi.tar.bz2
3,進(jin)入配置(zhi)文件修改環境變量(liang);
sudo vi /etc/bash.bashrc
進入(ru)之后在(zai)后一行添加如下代碼:
export PATH=$PATH:/home/fs/arm-cortex_a8/bin
注:fs為名叫fs的用戶
4,配置生效(xiao):
source /etc/bash.bashrc
5,測試:
在(zai)命令行輸入:
arm-c{TAB}(按TAB可以補(bu)全,說明交叉編譯器安裝成功(gong))

