天天看點

交叉編譯和交叉調試環境搭建及使用

交叉編譯和交叉調試環境搭建及使用

1. 交叉編譯器

1.1 交叉編譯器介紹

在一種計算機環境中運作的編譯程式,能編譯出在另外一種環境下運作的代碼,我們就稱這種編譯器支援交叉編譯。這個編譯過程就叫交叉編譯。簡單地說,就是在一個平台上生成另一個平台上的可執行代碼,而這種工具就是交叉編譯器(cross compiler)。

1.2 搭建交叉編譯環境 

1.2.1 實驗環境

交叉編譯工具:arm-linux- 4.2.2

編譯平台:ubuntu10.10

開發闆類型:UT-S3C6410

1.2.2 搭建步驟

1) 在/usr/local/下建立交叉編譯器的安裝目錄arm:

sudo  mkdir /usr/local/arm

2)将下載下傳的交叉編譯器包解壓到/usr/local/arm目錄下:

sudo tar jxvf cross-4.2.2-eabi.tar.bz2 -C /usr/local/arm/ 

3)解壓成功後,修改PATH環境變量:

sudo vim  /etc/profile

在檔案為加入交叉編譯器arm-linux-所在的路徑:

export PATH=$PATH:/usr/local/arm/4.2.2-eabi/usr/bin

然後退出vim。

4) 更新一下配置檔案/etc/profile:

source /etc/profile

5)檢測是否安裝成功:

現在就可以使用交叉編譯器了,寫一個測試程式helloworld,交叉編譯下,看是否能在開發闆上運作。

         i. 交叉編譯測試程式

arm-linux-gcc helloworld.c -o helloworld

         ii.把生成的可執行檔案helloworld複制到NFS的挂載目錄下:

sudo  cp ./helloworld   /nfsboot

注意:本實驗中開發闆使用NFS挂載rootfs,nfsboot是NFS的挂載目錄。

        iii.在超級終端上運作:

./helloworld

執行結果:

2. 交叉調試GDB的介紹和使用

2.1 GDB是什麼?

GDB(GNU symbolic debugger) 簡單的說是UNIX和LINUX下的一個調試工具。

2.2 GDB的主要特性

像所有的調試器一樣,GDB可以讓你調試一個程式,包括讓程式在你希望的地方停下,此時你可以檢視變量,寄存器,記憶體及堆棧。更進一步你可以修改變量及記憶體值。GDB是一個功能很強大的調試器,它可以調試多種語言。在此我們僅涉及C和C++的調試,而不包括其它語言。還有一點要說明的是,GDB是一個調試器,而不像VC一樣是一內建環境。你可以使用一些前端工具如XXGDB,DDD等。他們都有圖形化界面,是以用更友善,但它們僅是GDB的一層外殼。是以,你仍應熟悉GDB指令。事實上,當你使用這些圖形化界面時間較長時,你才會發現熟悉GDB指令的重要性。

2.3 GDB的安裝

1)下載下傳源碼:

2)先做一些準備工作:

a)Sudo mkdir –p /usr/local/arm-gdb

b)Sudo chown –R cjok /usr/local/arm-gdb

c)cd Download

3)然後開始編譯arm-linux-gdb

a)解壓gdb包:

        tar zxvf gdb-7.2.tar.gz

b) 配置configure檔案:

cd gdb-7.2/

./configure --target=arm-linux  --prefix=/usr/local/arm-gdb

c)編譯和安裝

make

sudo make install

d)cd到/usr/local/arm-gdb/目錄下會看到

cd  /usr/local/arm-gdb

ls

e)然後把arm-linux-gdb所在的路徑添加到PATH環境變量中:

sudo vim /etc/profile

在檔案為加入export PATH=$PATH:/usr/local/arm-gdb/bin

檢視一下:

4)編譯gdbserver

a)配置configure檔案

cd  gdb-7.2/gdb/gdbserver/

./configure --target=arm-linux --host=arm-linux

b)編譯

make CC=arm-linux-gcc

c)把剛剛生成的gdbserver拷貝到NFS共享目錄下,因為gdbserver最終是在目标機上運作:

sudo cp gdbserver /nfsboot/

5) 測試gdbserver

a)編譯一個簡單的程式helloworld.c

arm-linux-gcc –g helloworld.c –o helloworld

cp helloworld /nfsboot

*記得編譯時,加-g選項

b)庫問題

需要注意的是運作gdbserver還需要libthread_db庫,如果你做的檔案系統裡沒有相應的庫,需要從交叉編譯器内拷貝一個過去。

cp –avf /usr/local/arm/4.2.2-eabi/lib/libthread_db*   /nfsboot/lib

注意:若不知道少了什麼庫,可以根據運作時錯誤提示拷貝。

c)到超級終端上啟動gdbserver

./gdbserver 192.168.1.10:2345 helloworld

注意:我用的HOST IP是192.168.1.10,2345是監聽端口,可以随便設定

然後會出現:

d)然後在主機上啟動gdb:

cd /nfsboot   

arm-linux-gdb helloworld

會出現:

連結到開發闆上:

target remote 192.168.1.128:2345

注意:192.168.1.128是開發闆的IP,2345是監聽端口,要與上面設定的相同

這是超級終端會出現:

e)設定一下gdb環境變量

 show solib-absolute-prefix

 set solib-absolute-prefix /usr/local/arm/4.2.2-eabi/lib/

usr/local/arm/4.2.2-eabi/lib/ 是交叉編譯器的庫路徑

 show solib-search-path

 set solib-search-path /nfsboot/lib/

/nfsboot/lib是檔案系統的庫路徑

注:紅色部分為執行的指令。

到此環境已經搭建好,現在可以像在Linux下用GDB調試程式了。

2.4 GDB的使用

OK,現在就可以開始交叉調試了。

a) 把之前的helloworld修改一下:

1 #include <stdio.h>

  2

  3 int main(void)

  4 {

  5 int a, b, i;

  6 a = 3;

  7 b = 4;

  8 i = a + b;

  9 printf("i = %d\n", i);

 10 return 0;

 11 }

b)交叉編譯生成可執行檔案之後,放到NFS的挂載目錄下

      i.在超級終端上執行:

./gdbserver 192.168.1.10:2345 helloworld      

        ii.在HOST上執行:

開始對程式進行調試:

2.5 GDB的常用指令

   load:裝入一個程式;

   symbol-file:裝入符号庫檔案,可以是用-g參數編譯的可執行檔案;

   f(ile):指定一個可執行檔案進行調試,gdb将讀取些檔案的調試訊息,如f a.exe;

   l(ist):列程式出源檔案;

   r(un) :裝載完要調試的可執行檔案後,可以用run指令運作可執行檔案;

   b(reak):設定斷點(break point),如b 25,則在源程式的第25行設定一個斷點,當程式執行到第25行時,就會産生中斷;也可以使用b funcname,funcname為函數的名稱;

當程式運作到斷點停下來時:

   c(ontinue):c指令可以另中斷的程式繼續執行,直到下一個中斷點或程式結束;

   p(rint):輸入某個變量的值,如程式定義了一個int a的就是,p a就會輸出aa的目前值;

   n(ext):程式執行到斷點時中斷執行,可以用n指令進行單步執行;

   s(tep):程式執行到斷點時中斷執行,可以用s指令進行單步執行進某一函數;

   q(uit):退出GDB

繼續閱讀