初探交叉編譯


一、虛擬機上編譯hello.c:

 

$gcc hello.c –o hello(本機編譯)

$arm-linux-gcc hello.c –o hello1(使用交叉工具鏈arm-linux-gcc4.3.2)

$arm-linux-gcc hello.c –o hello2(使用交叉工具鏈arm-linux-gcc3.4.1)

PS:最開始使用的是開發板(優龍ST2410)自帶的交叉編譯工具鏈cross-3.3.2。

 

二、主機(PC)串口終端顯示信息(運行結果):


(這裏通過nfs服務,將虛擬機上的/home目錄掛載到開發板的/tmp目錄下,這樣操作/tmp目錄就相當於訪問了虛擬機上的/home目錄,通過這種方式將應用程序裝載到內存中運行,不用下載到flash上,便於監控和調試,而調試成功後可以根據需要燒寫到flash裏)。

1、  hello是本機(裝有linux系統的主機)編譯後的可執行文件,只能夠在x86平臺下運行;

2、  hello1是使用交叉編譯工具鏈arm-linux-gcc 4.3.2編譯後的可執行程序,能在arm version 1(SYSV)上運行,顯示結果說不存在連接器(解釋器),不知是不是版本問題;

3、  hello2是使用交叉編譯工具鏈arm-linux-gcc 3.4.1編譯後的可執行程序,能在arm version 1(ARM)上運行,顯示結果正確。

 

經過幾番周折之後,終於成功地在開發板上運行”helloworld!”程序!

這樣虛擬機上就安裝了三個交叉編譯工具鏈:3.3.2、4.3.2和3.4.1。這三個交叉編譯工具鏈的編譯對象不一樣,如針對內核、QT、應用程序等,實際操作時可以根據情況更改交叉編譯工具鏈(由於都已經安裝上了,所以只需在環境變量裏更改相應的路徑即可,命令是vi /etc/bashrc)。

 

 

三、回到最初碰到的問題:


上圖是將工具鏈改爲3.3.2後交叉編譯後的結果(在虛擬機上都編譯不通過,就不用在目標機上運行了吧!),顯示不存在stdio.h這個文件或目錄,網上查找了原因,衆說風雲,最後還是沒有找出解決問題的方法。

 

發現問題、解決問題的過程:

發現上面那個問題後,我又在網上下載了4.3.2版本的工具鏈,併成功地安裝在虛擬機上,此時在虛擬機上編譯成功了,但是在目標機上卻出現下面這個問題:

bash:./hello1:/lib/ld-linux.so.3:badELF interpreter: No such file or directory.

面對這個結果,我無語了,同時不解鏈接器怎麼出問題了。好吧,看樣子應該還是版本的問題,於是乎,我又從網上下載了3.4.1版本的工具鏈,併成功安裝,更改環境變量,添加路徑。然後開始在虛擬機上執行以下命令:arm-linux-gcc hello.c –o hello2,編譯成功。通過file hello2查看hello2文件的信息,發現可以在arm上運行,從顯示信息上看armversion 1後面括號的內容變爲ARM了,同時內核版本也變了,估計問題就出現在這裏。之後在開發板上運行hello2,此時終於成功地顯示出“hello world!”,真是皇天不負有心人!

 

總結:敢於嘗試,不怕失敗,遇到錯誤後思考問題可能出在哪裏,通過網上查找、詢問、請教,千萬不能輕易放棄,堅持到最後就一定會成功!

 

2014年1月9日星期四































































































































































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章