国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種簡化魯棒的ARM-Linux交叉編譯器構(gòu)建方法*

2014-03-27 04:24李云飛劉軍清雷幫軍龔國強(qiáng)
關(guān)鍵詞:源碼編譯器靜態(tài)

李云飛,劉軍清,雷幫軍,龔國強(qiáng)

(三峽大學(xué) 智能視覺與圖像信息研究所, 湖北 宜昌 443002)

在嵌入式應(yīng)用系統(tǒng)中,ARM-Linux嵌入式平臺(tái)技術(shù)正在迅速發(fā)展,其應(yīng)用范圍越來越廣泛,有著很好的發(fā)展前景,在手機(jī)處理器中ARM處理器已經(jīng)占了90%的份額。從事以ARM-Linux為平臺(tái)的嵌入式開發(fā)工作,針對(duì)ARM-Linux平臺(tái)的交叉編譯器是必備的工具。最常用的針對(duì)ARM-Linux平臺(tái)的交叉編譯器是在Linux環(huán)境下的ARM-Linux交叉編譯器。構(gòu)建ARM-Linux交叉編譯器可以利用Crosstool腳本工具構(gòu)建,也可以采用分步方式構(gòu)建。與利用Crosstool腳本工具構(gòu)建交叉編譯器的方式相比,分步方式較復(fù)雜,但分步方式的構(gòu)建過程完全可控,具有高度的可定制性,可以構(gòu)建出符合特定要求的交叉編譯器。因此,利用分步式構(gòu)建的交叉編譯器可以和目標(biāo)機(jī)有非常好的吻合,具有高可靠性和便利性[1-3]。

利用分步方式構(gòu)建交叉編譯器,構(gòu)建過程較復(fù)雜,因此編譯成功率低,本文對(duì)分步式構(gòu)建交叉編譯器的方法進(jìn)行了改進(jìn),并對(duì)構(gòu)建過程中遇到的參數(shù)設(shè)置、版本選擇、庫依賴等問題進(jìn)行了分析和總結(jié),以提高利用分步式構(gòu)建交叉編譯器的成功率。

1 常規(guī)的構(gòu)建方法

分步式構(gòu)建交叉編譯器的基本工作是利用交叉編譯器所需的程序源碼并按照一定步驟編譯出所要求的交叉編譯器。利用源碼編譯程序有參數(shù)配置、編譯、安裝三個(gè)步驟[4],如圖1所示。三個(gè)步驟中參數(shù)配置是最重要的一步,參數(shù)配置是否正確,決定著后續(xù)編譯工作是否能順利進(jìn)行。

圖1 利用源碼編譯安裝程序步驟Fig.1 The steps of compiling and installing program form source

圖2為ARM-Linux交叉編譯器的常規(guī)分步方式構(gòu)建流程。分為7個(gè)步驟。前三個(gè)步驟為準(zhǔn)備階段,為后續(xù)工作提供必要的程序源碼、工具軟件和頭文件,后面四個(gè)步驟是核心工作。這四個(gè)步驟之間有嚴(yán)格依賴的關(guān)系,所以它們的執(zhí)行順序必須嚴(yán)格遵從圖所示的順序。Binutils提供一系列交叉編譯器的二進(jìn)制工具,后續(xù)階段都需要利用它。靜態(tài)GCC的作用是用來編譯Glibc,是一個(gè)過度性工具,這個(gè)階段的GCC只支持C語言,不支持動(dòng)態(tài)庫、線程庫等一些特性。Glibc提供C語言標(biāo)準(zhǔn)的靜態(tài)庫和動(dòng)態(tài)庫。完整版GCC支持動(dòng)態(tài)庫、線程庫等一些特性,這些特性是需要有Glibc庫的支持才可以編譯成功[5-8]。

圖2 常規(guī)分步式構(gòu)建交叉編譯器流程圖Fig.2 The flowchart of the conventional method to build a cross-compiler step by step

2 改進(jìn)分步式構(gòu)建方法

圖3為改進(jìn)的分步式構(gòu)建交叉編譯器的構(gòu)建流程。相對(duì)于常規(guī)的方法,改進(jìn)方法中沒有了編譯靜態(tài)GCC的步驟,但在準(zhǔn)備工作階段,改進(jìn)方法需要安裝功能完整的交叉編譯器,在編譯Glibc時(shí)使用的編譯器是安裝的功能完整ARM-Linux交叉編譯器。在常規(guī)分步式構(gòu)建交叉編譯器的過程中,靜態(tài)GCC是一個(gè)過度性工具,它的作用只是編譯Glibc,因此可以利用功能完整的交叉編譯器代替靜態(tài)GCC來編譯Glibc。與常規(guī)方法中的靜態(tài)GCC不同,替代的功能完整ARM-Linux交叉編譯器的選擇不是唯一的,所有能編譯對(duì)應(yīng)Glibc的功能完整ARM-Linux交叉編譯器都可以使用。一般情況下,最后編譯的完整版GCC的特性是要符合特定要求的,參數(shù)配置中關(guān)于處理器架構(gòu)的配置參數(shù)和替代的功能完整交叉編譯器的可能不同,所以在利用替代的交叉編譯器編譯Glibc時(shí),要檢查替代的交叉編譯器的配置參數(shù)中與處理器架構(gòu)相關(guān)的配置參數(shù)和將要編譯的完整版的GCC中關(guān)于處理器架構(gòu)的參數(shù)配置是否一樣,如果不一樣,在編譯Glibc時(shí)需要使用如-march、-mcpu、-mfloat等與處理器架構(gòu)相關(guān)的編譯參數(shù),使替代交叉編譯器用與將要編譯完整GCC的參數(shù)配置中相同的處理器架構(gòu)相關(guān)的編譯參數(shù)編譯Glibc[9-15]。

圖3 改進(jìn)的分步式構(gòu)建交叉編譯器流程圖Fig.3 The flowchart of the improved method to build a cross-compiler step by step

在常規(guī)分步式構(gòu)建交叉編譯器的過程中,在編譯靜態(tài)GCC時(shí),還沒有編譯Glibc,參數(shù)配置時(shí)需要關(guān)閉需要Glibc庫支持的特性,開啟必需的功能,使參數(shù)配置變得復(fù)雜,容易出錯(cuò),從而導(dǎo)致編譯失敗率增加。在編譯Glibc時(shí),由于此時(shí)編譯它的靜態(tài)GCC功能不完整,需要在參數(shù)配置時(shí)進(jìn)行相應(yīng)的設(shè)置和修改相關(guān)文件,才能使編譯通過。這些原因增加構(gòu)建交叉編譯器的復(fù)雜,并降低了成功率。在改進(jìn)的方法中,利用已功能完整的交叉編譯器代替靜態(tài)GCC,沒有編譯靜態(tài)GCC的階段,因此可以避免編譯靜態(tài)GCC時(shí)復(fù)雜的參數(shù)配置和易出現(xiàn)的失敗。由于編譯Glibc的編譯器功能完整,在編譯Glibc時(shí),無需進(jìn)行特定參數(shù)設(shè)置和修改相關(guān)文件,因此降低了編譯Glibc是參數(shù)配置的復(fù)雜度和失敗率。與常規(guī)方法中的靜態(tài)GCC不同,替代的功能完整ARM-Linux交叉編譯器選擇不是唯一的,所有能編譯對(duì)應(yīng)Glibc的功能完整ARM-Linux交叉編譯器都可以使用,因此,在編譯Glibc時(shí),可以避免由于GCC和Glibc版本不匹配導(dǎo)致的錯(cuò)誤。在準(zhǔn)備階段,改進(jìn)方法需要另外安裝功能完整的交叉編譯器,但功能完整的交叉編譯器容易獲得,安裝簡單,對(duì)整體工作量和難度的影響很小。

為了驗(yàn)證分析結(jié)果,在最終編譯出的完整GCC特性要求相同,主機(jī)環(huán)境相同條件下,分別用常規(guī)的方法和改進(jìn)的方法做編譯實(shí)驗(yàn),獲得兩種方法核心步驟中每個(gè)步驟的所必須的參數(shù)配置數(shù)目。實(shí)驗(yàn)環(huán)境如表1所示。

表1 實(shí)驗(yàn)環(huán)境

實(shí)驗(yàn)結(jié)果如表2所示。表2顯示了兩種方法的在最終完整GCC特性要求相同的情況下核心步驟的參數(shù)配置的數(shù)目。從表2可以看出,改進(jìn)方法需要配置的參數(shù)數(shù)目總共39個(gè),比常規(guī)方法少了20個(gè),很大程度上減少了參數(shù)配置的復(fù)雜度。分步式構(gòu)建交叉編譯器的過程中產(chǎn)生的大部分錯(cuò)誤都是由參數(shù)配置不當(dāng)而引起的,參數(shù)配置的復(fù)雜度越低,產(chǎn)生錯(cuò)誤的概率就越小。因此改進(jìn)的方法可以很大程度地提高整個(gè)編譯過程的成功率和穩(wěn)定性。

表2 核心步驟參數(shù)配置數(shù)目

圖4顯示用柱狀圖來比較兩種方法的核心步驟的參數(shù)配置數(shù)目。從圖中可以直觀的看出改進(jìn)的方法的參數(shù)數(shù)目比常規(guī)的方法要少很多。本文方法不存在編譯靜態(tài)GCC的步驟,編譯過程中總的參數(shù)配置數(shù)目要比傳統(tǒng)方法少20個(gè)以上。

圖4 核心步驟參數(shù)配置數(shù)目的柱狀圖Fig.4 The histogram of number of parameters in the core steps

3 問題分析及解決方法

下面就本文方法在實(shí)際應(yīng)用中存在的三個(gè)主要問題進(jìn)行分析,并給出相應(yīng)的解決方法。

3.1 參數(shù)配置

每個(gè)階段的編譯工作都需要通過configure腳本文件進(jìn)行參數(shù)配置,可以使用configure-help命令查看參數(shù)的簡要說明。每個(gè)步驟有很多配置參數(shù),主要包括安裝目錄參數(shù)(如-prefix)、系統(tǒng)類型參數(shù)(-build、-host、-target)、相關(guān)特性和功能參數(shù)(以enable、disable、with、without為前綴)等。

安裝目錄參數(shù)中最常用的是-prefix,作用是將所有的文件安裝到指定目錄下。其他相關(guān)的安裝目錄參數(shù)作用是將不同類型文件分別安裝到不同目錄下。系統(tǒng)類型參數(shù)包括-build、-host和-target,但Glibc的系統(tǒng)類型參數(shù)只有-build和-host。參數(shù)-build指定編譯此工具的平臺(tái),參數(shù)-host指定運(yùn)行此工具的平臺(tái),參數(shù)-target指定此工具產(chǎn)生的文件運(yùn)行的平臺(tái)。通常情況,參數(shù)-build、-host的值是編譯此工具的平臺(tái),參數(shù)-build、-host的值可以通過命令echo ${MACHTYPE}獲得。-target參數(shù)的值可以根據(jù)表3設(shè)置。每個(gè)工具的相關(guān)特性和功能參數(shù)有所不同,而且此類型的參數(shù)較多,對(duì)于它們的設(shè)置要根據(jù)具體要求設(shè)置。

表3 Target值

3.2 版本選擇

在制作交叉編譯器之前,需要選擇滿足要求的Binutils、GCC、Glibc和主機(jī)GCC的版本,否則,會(huì)導(dǎo)致編譯失敗。一般情況,由于版本選擇問題導(dǎo)致的編譯失敗,主要表現(xiàn)為符號(hào)未定義、函數(shù)名未定義等語法錯(cuò)誤。這是由于在新版本中存在一定程度的改動(dòng)或添加了一些新特性,導(dǎo)致程序之間會(huì)存在兼容性問題。

在利用常規(guī)的分步式構(gòu)建交叉編譯器過程中,如果在編譯Glibc時(shí)出現(xiàn)符號(hào)未定義、函數(shù)名未定義等語法錯(cuò)誤,主要原因是由于前一階段編譯的靜態(tài)GCC的版本不滿足要求,因?yàn)榫幾gGlibc是利用前一階段的靜態(tài)GCC來進(jìn)行的。如果在編譯靜態(tài)GCC和完整版GCC出現(xiàn)符號(hào)未定義、函數(shù)名未定義等語法錯(cuò)誤,主要是由于主機(jī)GCC版本不滿足要求,因?yàn)殪o態(tài)GCC和完整版GCC由主機(jī)GCC編譯的。在選擇每個(gè)工具的版本時(shí),首先選擇Glibc的版本,盡量不要選擇最新的版本。然后,根據(jù)Glibc源碼根目錄下的INSTALL文件里說明,選擇GCC和Binutils版本。再根據(jù)GCC源碼目錄下INSTALL文件夾下prerequisites.html文件里的說明選擇主機(jī)GCC的版本。

在改進(jìn)的方法中,在編譯Glibc時(shí)出現(xiàn)符號(hào)未定義、函數(shù)名未定義等語法錯(cuò)誤,主要原因是替代靜態(tài)GCC的完整交叉編譯器的版本選擇不滿足要求。要根據(jù)Glibc源碼根目錄下的INSTALL文件里說明選擇其版本,建議選擇和將要編譯的GCC的版本相近的版本。對(duì)于GCC和binutils版本的選擇不需要根據(jù)Glibc源碼根目錄下的INSTALL文件中的要求選擇,選擇自由度大。宿主機(jī)的GCC編譯器的版本要根據(jù)GCC源碼目錄下INSTALL文件夾下prerequisites.html文件里的要求選擇。

3.3 庫依賴問題

庫依賴問題,是指編譯器搜索不到所需的庫文件。在編譯交叉編譯器的過程中,庫依賴問題經(jīng)常出現(xiàn)。出現(xiàn)庫依賴問題,一般會(huì)有“l(fā)d: cannot find -lx”(x為庫名)的錯(cuò)誤提示,然而一些情況,一些其他錯(cuò)誤提示也可能由庫依賴問題引起,這種情況,需要到出錯(cuò)的目錄下,查看config.cache文件。在此文件中,在出現(xiàn)錯(cuò)誤信息的前面幾行會(huì)顯示出錯(cuò)的具體原因,如果是庫依賴問題引起的,會(huì)有相關(guān)錯(cuò)誤提示。

在制作交叉編譯器的過程中出現(xiàn)庫依賴問題的原因主要有三種。相關(guān)庫的路徑不在編譯器的搜索路徑里會(huì)產(chǎn)生庫依賴問題。這種情況可以通過變量LD_LIBRARY_PATH或LDFLAGS將庫文件的路徑添加到編譯器的搜索路徑里;庫文件的鏈接文件失效或不存在會(huì)產(chǎn)生庫依賴問題。這種情況,要重新建立庫文件的鏈接文件。在利用常規(guī)的分步式構(gòu)建交叉編譯器過程中,靜態(tài)GCC編譯完成后,需要對(duì)libgcc.a靜態(tài)庫文件在同目錄下建立兩個(gè)名為libgcc_sh.a、libgcc_eh.a的鏈接文件,否則,會(huì)引起由于庫文件的鏈接文件不存在導(dǎo)致的庫依賴問題;在利用常規(guī)的分步式和改進(jìn)的方法構(gòu)建交叉編譯器過程中,在編譯Glibc完成后,都需要對(duì)安裝目錄下lib文件夾下的libc.so和libpthread.so進(jìn)行修改,這兩個(gè)文件需要在終端里用VI編輯器打開,并將兩個(gè)文件中GROUP后面每個(gè)庫文件的絕對(duì)路徑刪除。如果不刪除絕對(duì)路徑,會(huì)導(dǎo)致編譯器找不到這兩個(gè)文件中描述的庫文件[16]。

4 總 結(jié)

本文對(duì)分步式構(gòu)建交叉編譯器的方法做了改進(jìn),在改進(jìn)的方法中,去除了編譯靜態(tài)GCC的階段,所以可以省去在這階段中復(fù)雜的參數(shù)配置,而且,由于編譯Glibc的交叉編譯器功能完整,在Glibc的參數(shù)配置中無需配置一些相應(yīng)的參數(shù),所以編譯Glibc階段的參數(shù)配置也變得相對(duì)簡單。不僅參數(shù)配置變得簡單,而且版本選擇相對(duì)容易。同時(shí),也可以避免編譯靜態(tài)GCC時(shí)出現(xiàn)的失敗,和由于靜態(tài)GCC的不完整導(dǎo)致編譯Glibc失敗。因此,改進(jìn)的方法可以很好的彌補(bǔ)分步式方法構(gòu)建交叉編譯器時(shí)過程復(fù)雜、成功率低的不足。本文構(gòu)建的交叉編譯器的方法是針對(duì)ARM處理器的,但同樣也適合MIPS、POWERPC等其他處理器。

[1] 劉二剛.利用crosstool-ng構(gòu)建交叉編譯工具鏈[J].電腦知識(shí)與技術(shù),2011,7(19):4553-4554+4567.

[2] 張歡慶,高麗,宋承祥.基于ARM的嵌入式Linux交叉編譯環(huán)境的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)與數(shù)字工程, 2012,40(2):151-153.

[3] 李文,張建澤.基于S3C2440的嵌入式Linux系統(tǒng)移植[J].化工自動(dòng)化及儀表,2010,37(9):88-92.

[4] 孟慶昌,牛欣源.Linux教程[M].北京,電子工業(yè)出版社,2011.

[5] WANG W H, GAO M Y. Design of embedded media player based on S3C2440 and SDL-FFMPEG[C]∥International Conference on Electrical and Control Engineering, 2011:2979-2982.

[6] 尤盈盈,孟利民.構(gòu)建嵌入式Linux交叉編譯環(huán)境[J].計(jì)算機(jī)與數(shù)字工程,2006,34(6):30-34.

[7] 林炎,張友益.Windows平臺(tái)下構(gòu)建嵌入式Linux交叉編譯環(huán)境[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2013(2):74-78.

[8] 許青林,解爭龍.基于ARM的Linux系統(tǒng)移植研究與實(shí)現(xiàn)[J].物聯(lián)網(wǎng)技術(shù),2013(1):37-42.

[9] 陳永強(qiáng),陶品,王篤強(qiáng).嵌入式Linux移植[J].實(shí)驗(yàn)室研究與探索,2012,31(9):67-72.

[10] 張瑞,于德海,馬明龍.基于ARM的嵌入式Linux的交叉編譯環(huán)境的建立[J].科技信息,2009(25):508-509.

[11] 何春山,譚劍.基于Redhat AS4并行計(jì)算機(jī)群的安裝研究[J]. 中山大學(xué)學(xué)報(bào):自然科學(xué)版,2006,45(3):114-116.

[12] 譚會(huì)生.ARM嵌入式系統(tǒng)原理及應(yīng)用開發(fā)[M].西安:西安電子科技大學(xué)出版社,2012.

[13] 李佳佳,馬永杰.Linux系統(tǒng)在S3C2440上移植的分析與實(shí)現(xiàn)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2012,21(10):214-219.

[14] 劉發(fā)貴,林愷,柴陽陽.GDIXEAP:面向服務(wù)的嵌入式軟件開發(fā)平臺(tái)[J].中山大學(xué)學(xué)報(bào):自然科學(xué)版,2008,47(2):37-41.

[15] 馮鋼,鄭扣銀.基于GCC的交叉編譯研究與開發(fā)[J].計(jì)算機(jī)工程與設(shè)計(jì),2004,25(11):1880-1883.

[16] 陽富明,李文海,涂剛.嵌入式動(dòng)態(tài)庫小型化技術(shù)研究[J].華中科技大學(xué)學(xué)報(bào),2004,32(9):6-8.

猜你喜歡
源碼編譯器靜態(tài)
面向數(shù)據(jù)可靠傳輸?shù)母咦g碼率帶反饋的LT碼
最新進(jìn)展!中老鐵路開始靜態(tài)驗(yàn)收
靜態(tài)隨機(jī)存儲(chǔ)器在軌自檢算法
國內(nèi)一站式工程設(shè)備租賃平臺(tái)眾能聯(lián)合完成C2、C3兩輪融資
面向理想性能空間的跨架構(gòu)編譯分析方法
淺談開源操作系統(tǒng)的歷史
企業(yè)如何保護(hù)源碼
基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
運(yùn)行速度大突破華為《方舟編譯器》詳解
油罐車靜態(tài)側(cè)傾穩(wěn)定角的多體仿真計(jì)算
郴州市| 泽州县| 凤山县| 辽宁省| 保山市| 锦州市| 望谟县| 大城县| 黄山市| 大方县| 交城县| 武平县| 全州县| 庄浪县| 吕梁市| 峨山| 高雄市| 锦州市| 景东| 郁南县| 土默特左旗| 绥芬河市| 琼中| 桃源县| 天镇县| 长沙县| 呈贡县| 内黄县| 托里县| 灌阳县| 通海县| 井陉县| 将乐县| 焦作市| 凤冈县| 贵德县| 新闻| 辉县市| 安庆市| 东丽区| 拉萨市|