日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

交叉编译和交叉调试环境的搭建及使用

發布時間:2025/1/21 编程问答 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 交叉编译和交叉调试环境的搭建及使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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掛載rootfsnfsbootNFS的掛載目錄。

?

????????iii.在超級終端上運行:

./helloworld

?

執行結果:

?

2.?交叉調試GDB的介紹和使用 2.1?GDB<span times="" new="" roman";="" mso-hansi-font-family:"times="" roman";mso-bidi-font-family:"times="" letter-spacing:.4pt;mso-fareast-language:zh-cn"="" style="word-wrap: break-word; font-family: 宋體;">是什么?

GDB(GNU symbolic debugger)?簡單的說是UNIXLINUX下的一個調試工具。

2.2?GDB的主要特性

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

?

2.3?GDB的安裝

1)下載源碼:

可以從http://www.gnu.org/software/gdb/download/獲取到最新的GDB版本。

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

source /etc/profile

查看一下:

????

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 IP192.168.1.102345是監聽端口,可以隨便設定

然后會出現:

d)然后在主機上啟動gdb

cd /nfsboot???

arm-linux-gdb helloworld

會出現:

?

鏈接到開發板上:

target remote 192.168.1.128:2345

注意:192.168.1.128是開發板的IP2345是監聽端口,要與上面設置的相同

這是超級終端會出現:

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上執行:

    arm-linux-gdb helloworld

    target remote 192.168.1.128:2345

    開始對程序進行調試:

    ?

    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 funcnamefuncname為函數的名稱;

    ?

    當程序運行到斷點停下來時:

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

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

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

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

    ???q(uit):退出GDB

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的交叉编译和交叉调试环境的搭建及使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。