<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

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

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

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



    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)下載源碼:

    可以從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 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. 1 #include <stdio.h>
    2.   2
    3.   3 int main(void)
    4.   4 {
    5.   5 int a, b, i;
    6.   6 a = 3;
    7.   7 b = 4;
    8.   8 i = a + b;
    9.   9 printf("i = %d\n", i);
    10.  10 return 0;
    11.  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 funcname,funcname為函數的名稱;

     

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

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

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

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

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

       q(uit):退出GDB

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全