實驗1交叉編譯工具鏈建立實驗_第1頁
實驗1交叉編譯工具鏈建立實驗_第2頁
實驗1交叉編譯工具鏈建立實驗_第3頁
實驗1交叉編譯工具鏈建立實驗_第4頁
實驗1交叉編譯工具鏈建立實驗_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、實驗1 交叉編譯工具鏈建立實驗1.1實驗?zāi)康?熟悉Linux操作系統(tǒng); 掌握交叉編譯工具鏈的建立過程; 掌握通過gdb調(diào)試程序的方法; 掌握makefile文件的寫法。1.2實驗設(shè)備 硬件:PC機; 軟件:Windows操作系統(tǒng)、VMware虛擬機和Linux操作系統(tǒng),或直接安裝于硬盤的Linux操作系統(tǒng),arm-linux-gcc安裝文件。1.3實驗內(nèi)容 安裝Linux操作系統(tǒng); 建立交叉編譯工具鏈; 編寫解決八皇后問題的程序。1.4實驗原理1.4.1交叉編譯工具鏈的簡介交叉編譯通俗地講就是在一種平臺上編譯出能運行在體系結(jié)構(gòu)不同的另一種平臺上的程式,例如我們試驗中在Linux平臺上編譯出能運

2、行在ARM為內(nèi)核的CPU平臺上的程式,編譯得到的可執(zhí)行文件是不能在Linux環(huán)境下運行的,必須放到ARM平臺上才能運行。這種方法在異平臺移植和嵌入式研發(fā)時非常有用的。 交叉編譯工具鏈是由編譯器、連接器和解釋器組成的綜合研發(fā)環(huán)境,交叉編譯工具鏈主要由binutils、gcc和glibc三個部分組成。有時出于減小libc庫大小的考慮,也能用別的C庫來代替glibc,例如uClibc、dietlibc和newlib。1.4.2交叉編譯工具鏈部分組件的介紹 GCC屬于GUN工具鏈中的編譯開發(fā)工具,它可以把源程序編譯為可執(zhí)行文件。GCC是支持支持 Ada 語言、C+ 語言、Java 語言、Objecti

3、ve C 語言、Pascal 語言、COBOL語言,以及支持函數(shù)式編程和邏輯編程的 Mercury 語言,等等的編譯器。GCC是可以在多種硬體平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%30%。GCC主要包括: cpp:GNU C編譯器的預(yù)處理器 gcc:符合ISO標準的C編譯器 g+:基本符合ISO標準的C+編譯器 gcj:GCC的java前端 gnat:GCC的GNU ADA 95的前端 binutils是一組二進制工具程序集合,是輔助GCC的主要軟件,其中主要包括: as:GNU匯編器 ld:GNU鏈接器 ar:創(chuàng)建歸檔文件,向庫中添加/提取obj文

4、件 nm:列出obj文件中的符號 objcopy:復(fù)制和轉(zhuǎn)化obj文件 objdump:顯示對象文件的信息 ranlib:根據(jù)歸檔文件中的內(nèi)容建立索引 readelf:顯示elf格式執(zhí)行文件中的各種信息 size:顯示object文件和執(zhí)行文件各段的總大小 strings:顯示文件中可以打印的字符 strip:去掉執(zhí)行文件中多余的信息(如調(diào)試信息) gprof:用來顯示圖表檔案數(shù)據(jù)。1.4.3Linux常用開發(fā)工具的介紹和使用上面我們對交叉編譯工具鏈做了概述,下面我們再給出linux下常用開發(fā)工具的介紹和使用。1.vi(vim) vi是linux下一種功能強大的,快速命令驅(qū)動的全屏幕編輯器,可

5、以類比DOS的edit。vi有三種操作模式:一是命令模式(或稱指令模式),在此模式下的按鍵當作指令來處理;一種是輸入模式(或稱插入模式),此模式的按鍵作為真正的輸入;另外一種是底行模式,在該模式下,光標位于屏幕的底行。用戶可以進行文件保存或退出操作,也可以設(shè)置編譯環(huán)境,如尋找字符串、列出行號等。初始啟動vi時處于命令模式。表1.1中列出了vi(vim)常用的命令。命 令介 紹光標移動類命令移動輸入光標h將光標向左移動一列j將光標向下移動一行k將光標向上移動一行l(wèi)將光標向右移動一列0將光標移動到當前行首$將光標移動到當前行尾Ctrl+F向前移動一頁Ctrl+B向后移動一頁w將光標移動到下一個單詞

6、的首字母e將光標移動到下一個單詞的末字母b將光標移動到前一個單詞的首字母退出類命令退出VIM編輯器:q!不保存文件強制退出:w!文件存盤:wq!文件存盤后退出:x文件存盤后退出編輯類命令編輯文本常用命令i從光標前開始插入文本a從光標后開始插入文本r修改光標所在處的字符x刪除光標處的一個字符dd刪除光標所在的整行內(nèi)容:5d刪除第五行o在光標所在行下增加一行并進入輸入模式u撤銷最后一個更改操作yy復(fù)制當前行p粘貼當前行rm替換當前字符為m,替換后仍處于命令模式下表1.1 vi(vim)常用命令 vi的命令有很多,我們需要經(jīng)常使用來熟悉這些命令,當你得心應(yīng)手的時候你會發(fā)現(xiàn)vi相比其他文本編輯器有很多

7、優(yōu)點,是一個非常高效的文本編輯器。2.arm-linux-gcc我們需要編譯出運行在ARM平臺上的代碼,所使用的交叉編譯器為arm-linux-gcc。下面將arm-linux-gcc編譯工具的一些常用命令參數(shù)介紹給大家。首先介紹下編譯器的工作過程,在使用GCC編譯程序時,編譯過程分為四個階段: (1) 預(yù)處理(Pre-Processing) (2) 編譯(Compiling) (3) 匯編(Assembling) (4) 鏈接(Linking) Linux程序員可以根據(jù)自己的需要讓 GCC在編譯的任何階段結(jié)束,以便檢查或使用編譯器在該階段的輸出信息,或者對最后生成的二進制文件進行控制,以便通

8、過加入不同數(shù)量和種類的調(diào)試代碼來為今后的調(diào)試做好準備。和其它常用的編譯器一樣,GCC也提供了靈活而強大的代碼優(yōu)化功能,利用它可以生成執(zhí)行效率更高的代碼。下面以文件example.c文件為例來說明它的命令用法:(1) arm-linux-gcc-o example example.c不加-c、-S、-E參數(shù),編譯器將執(zhí)行預(yù)處理、編譯、匯編、連接操作直接生成可執(zhí)行代碼。-o參數(shù)用于指定輸出的文件,輸出文件名為example,如果不指定輸出文件,則默認輸出a.out。(2) arm-linux-gcc-c -o example.o example.c-c參數(shù)將對源程序example.c進行預(yù)處理、編

9、譯、匯編操作,生成example.0文件。去掉指定輸出選項“-o example.o”自動輸出為example.o,所以在這里-o加不加都可以。(3) arm-linux-gcc-S -o example.s example.c-S參數(shù)將對源程序example.c進行預(yù)處理、編譯,生成example.s文件。-o選項同上。(4) arm-linux-gcc-E -o example.i example.c-E參數(shù)將對源程序example.c進行預(yù)處理,生成example.i文件(不同版本不一樣,有的將預(yù)處理后的內(nèi)容打印到屏幕上),就是將#include,#define等進行文件插入及宏擴展等操

10、作。(5) arm-linux-gcc-v -o example example.c加上-v參數(shù),顯示編譯時的詳細信息,編譯器的版本,編譯過程等。(6) arm-linux-gcc-g -o example example.c-g選項,加入GDB能夠使用的調(diào)試信息,使用GDB調(diào)試時比較方便。(7) arm-linux-gcc-Wall -o example example.c-Wall選項打開了所有需要注意的警告信息,像在聲明之前就使用的函數(shù),聲明后卻沒有使用的變量等。(8) arm-linux-gcc-Ox -o example example.c-Ox使用優(yōu)化選項,X的值為空、0、1、2、

11、3,0為不優(yōu)化,優(yōu)化的目的是減少代碼空間和提高執(zhí)行效率等,但相應(yīng)的編譯過程時間將較長并占用較大的內(nèi)存空間。(9) arm-linux-gcc -I /home/include -o example example.c-Idirname: 將dirname所指出的目錄加入到程序頭文件目錄列表中。如果在預(yù)設(shè)系統(tǒng)及當前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。(10) arm-linux-gcc -L /home/lib -o example example.c-Ldirname:將dirname所指出的目錄加入到庫文件的目錄列表中。在默認狀態(tài)下,連接程序ld在系統(tǒng)的預(yù)設(shè)路徑中

12、(如/usr/lib)尋找所需要的庫文件,這個選項告訴連接程序,首先到-L指定的目錄中去尋找,然后再到系統(tǒng)預(yù)設(shè)路徑中尋找。(11) arm-linux-gcc static -o libexample.a example.c靜態(tài)鏈接庫文件3.gdbgdb是GNU發(fā)布的linux下的字符界面調(diào)試工具,它的功能非常強大,其中主要有: 按用戶的要求啟動程序 讓被調(diào)試的程序在任意斷點處停止(斷點可以是條件表達式) 程序暫停時可檢查運行環(huán)境 程序暫停時可動態(tài)改變運行環(huán)境 要使用gdb調(diào)試程序,在用gcc編譯源文件時要指定-g選項,以使程序中包含必要的信息。 gcc g program.c /使用gdb的

13、前提 gdb program (gdb)file p /啟動gdb (gdb)help command /查看命令gdb中程序的暫停方式(或稱停止點)有以下幾種: 斷點(breakpoint) 觀察點(breakpoint) 捕捉點(catchpoint) 信號(signals) 線程停止(thread stops) 可以用c命令恢復(fù)程序的運行。其中用break命令設(shè)置斷點,有以下幾種方法: break function /執(zhí)行到某函數(shù)終止 break linenum /執(zhí)行到某行終止 break+offset /在當前行后offset行停止 break-offset /在當前行前offset

14、行停止 break filename:linenum /執(zhí)行到指定文件中的某行終止 break filename:function /執(zhí)行到指定文件中的某函數(shù)終止 break *address /執(zhí)行到某地址處終止 tbreak /僅中斷一次,中斷后斷點自動刪除 break.if condition /條件斷點 例如:設(shè)置條件斷點:break 18 if i=50,用condition命令可以修改條件(condition bnum expression);清除停止條件可以用condition bnum;ignore命令可以指定程序運行時忽略條件幾次(ignore bnum count);使用i

15、nfo命令可以查看斷點。表1. 2給出了gdb一些常用的命令:基本gdb命令命令描述file裝入想要調(diào)試的可執(zhí)行文件kill終止正在調(diào)試的程序list或l列出產(chǎn)生可執(zhí)行文件的源代碼的一部分next或n執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部step或s執(zhí)行一行源代碼而且進入函數(shù)內(nèi)部run或r執(zhí)行當前被調(diào)試的程序quit或q退出gdbwatch監(jiān)視一個變量的值而不管它何時被改變break或b在代碼里設(shè)置斷點make使不退出gdb就可以重新產(chǎn)生可執(zhí)行文件shell使不必離開gdb就能執(zhí)行shell命令。表1.2 gdb常用命令總之,gdb的功能非常的強大,可以根據(jù)我們的需求啟動,停止程序4.geditged

16、it是一個GNOME桌面環(huán)境下兼容UTF-8的文本編輯器。它使用GTK+編寫而成,因此它十分的簡單易用,有良好的語法高亮,對中文支持很好,支持包括gb2312、gbk在內(nèi)的多種字符編碼。gedit是一個自由軟件。是 Linux 下的一個純文本編輯器,但你也可以把它用來當成是一個集成開發(fā)環(huán)境 (IDE), 它會根據(jù)不同的語言高亮顯現(xiàn)關(guān)鍵字和標識符。5.tartar可以為文件和目錄創(chuàng)建檔案。利用tar,用戶可以為某一特定文件創(chuàng)建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文件。tar最初被用來在磁帶上創(chuàng)建檔案,現(xiàn)在,用戶可以在任何設(shè)備上創(chuàng)建檔案,如軟盤。利用tar命令,可以把一大

17、堆的文件和目錄全部打包成一個文件,這對于備份文件或?qū)讉€文件組合成為一個文件以便于網(wǎng)絡(luò)傳輸是非常有用的。Linux上的tar是GNU版本的。語法:tar 主選項+輔選項 文件/目錄。使用該命令時,主選項是必須要有的,它告訴tar要做什么事情,輔選項是輔助使用的,可以選用。命 令介 紹主選項c創(chuàng)建新的檔案文件r把要存檔的文件追加到檔案文件的未尾t列出檔案文件的內(nèi)容u更新文件x從檔案文件中釋放文件退出類命令退出VIM編輯器b該選項是為磁帶機設(shè)定的f使用檔案文件或設(shè)備,這個選項通常是必選的k保存已經(jīng)存在的文件m在還原文件時,把所有文件的修改時間設(shè)定為現(xiàn)在M創(chuàng)建多卷的檔案文件,以便在幾個磁盤中存放v詳

18、細報告tar處理的文件信息w每一步都要求確認z用gzip來壓縮/解壓縮文件,加上該選項后可以將檔案文件進行壓縮,但還原時也一定要使用該選項進行解壓縮表1.3 tar常用命令6. makefileMakefile文件描述了整個工程的編譯、連接等規(guī)則。其中包括:工程中的哪些源文件需要編譯以及如何編譯、需要創(chuàng)建那些庫文件以及如何創(chuàng)建這些庫文件、如何最后產(chǎn)生我們想要的可執(zhí)行文件。盡管看起來可能是很復(fù)雜的事情,但是為工程編寫Makefile 的好處是能夠使用一行命令來完成“自動化編譯”,一旦提供一個(通常對于一個工程來說會是多個)正確的Makefile。編譯整個工程你所要做的唯一的一件事就是在shell

19、 提示符下輸入make命令。整個工程完全自動編譯,極大提高了效率。make是一個命令工具,它解釋Makefile中的指令(應(yīng)該說是規(guī)則)。在Makefile文件中描述了整個工程所有文件的編譯順序、編譯規(guī)則。Makefile 有自己的書寫格式、關(guān)鍵字、函數(shù)。像C 語言有自己的格式、關(guān)鍵字和函數(shù)一樣。而且在Makefile 中可以使用系統(tǒng)shell所提供的任何命令來完成想要的工作。Makefile(在其它的系統(tǒng)上可能是另外的文件名)在絕大多數(shù)的IDE 開發(fā)環(huán)境中都在使用,已經(jīng)成為一種工程的編譯方法。1.5實驗步驟1.5.1 交叉編譯工具鏈的建立Linux系統(tǒng)中的一些操作需要獲得root權(quán)限才能進行

20、,通過su root命令,輸入密碼獲得root權(quán)限即可進行相關(guān)操作,如圖1.1。圖1.1 root權(quán)限獲得1.建立工作目錄在Ubuntu操作系統(tǒng)的/tmp/test目錄下建立test1目錄以作為放置arm-linux交叉編譯工具的位置。將arm-linux交叉編譯工具源碼包arm-linux-gcc-4.4.3.tgz,通過虛擬機共享文件夾/mnt/hgfs/share拷貝到此目錄下,具體操作如下:#mkdir /tmp/test/test1#cp /mnt/hgfs/share/arm-linux-gcc-4.4.3.tgz /tmp/test/test1如圖1.2所示:圖1.2 arm-l

21、inux-gcc安裝所用文件2.解壓縮包使用tar命令對arm-linux交叉編譯工具源碼包進行解壓,如圖1.3所示:圖1.3 解壓3.系統(tǒng)配置解壓結(jié)束后,需要對系統(tǒng)進行簡單配置。使用vi或者gedit編輯root用戶的配置文件.bashrc,該文件是一個隱藏文件。在該文件最后一行添加上arm-linux交叉編譯工具的存放路徑,然后保存退出,添加的內(nèi)容為:export PATH=$PATH:/opt/FriendlyARM/toolschain/4.3.2/bin,該路徑應(yīng)根據(jù)解壓的4.4.3文件所在路徑?jīng)Q定,不同的解壓方法可能解壓的路徑各不相同,需要注意。如圖1.2所示。圖1.4 交叉編譯工

22、具存放路徑保存退出后,使用source命令,使修改生效,再運行arm-linux-gcc v命令,此時有arm-linux-gcc版本和配置信息輸出即說明交叉工具鏈安裝完成。如圖1.3所示:圖1.5 版本信息1.5.2 編寫hello文件進行交叉編譯編寫hello.c文件代碼如下圖所示:圖1.6 hello.c文件代碼請自行將hello world改為每組兩位同學(xué)的姓名與學(xué)號,并拍照,將圖片嵌入實驗報告中。保存退出。使用arm-linux交叉編譯工具對寫好的hello.c程序進行交叉編譯,生成可執(zhí)行文件hello,在hello.c文件目錄下執(zhí)行代碼為:arm-linux-gcc o hello

23、 hello.c。在當前目錄下生成可執(zhí)行文件hello,如圖1.5所示。圖1.7 編譯hello.c1.5.3 編寫8皇后問題程序1. 題目說明八皇后問題是一個古老而著名的問題,是回溯算法的典型例題。該問題是十九世紀著名的數(shù)學(xué)家高斯1850年提出:在88格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法,并輸出這些擺法的棋譜,放置皇后的位置輸出,其他位置輸出*。為解決這個問題,把棋盤的橫坐標定為i,縱坐標定為j, i和j的取值范圍是從到。當某個皇后占了位置(i, j)時,在這個位置的垂直方向、水平方向和斜線方向都不能再放其它皇后了。

24、首先,可以定義四Queen88、a8、b15和c15分別用來存放棋盤,棋盤的列狀態(tài),棋盤的主對角線狀態(tài)和棋盤的從對角線狀態(tài)。其中:aj-1=1 第j列上無皇后aj-1=0 第j列上有皇后bi+j-2=1 (i, j)的對角線(右上至左下)無皇后bi+j-2=0 (i, j)的對角線(右上至左下)有皇后ci-j+7=1 (i, j)的對角線(左上至右下)無皇后ci-j+7=0 (i, j)的對角線(左上至右下)有皇后 為第i個皇后選擇位置的算法偽碼如下:for(j=1;j=8;j+) /*第i個皇后在第j行*/if (i,j)位置為空)) /*即相應(yīng)的三個數(shù)組的對應(yīng)元素值為1*/占用位置(i,j

25、) /*置相應(yīng)的三個數(shù)組對應(yīng)的元素值為0*/if i8為i+1個皇后選擇合適的位置; else 輸出一個解在終端下,運行自己的程序,顯示如下的結(jié)果: 省略 *53* 省略 最后一行,應(yīng)輸出每組兩位同學(xué)的姓名與學(xué)號,并拍照,將圖片嵌入實驗報告中。請大家按照以上說明編寫相應(yīng)源程序,并編譯執(zhí)行。2. 利用make來管理工程關(guān)于make的原理和使用方法,已經(jīng)在前面的實驗原理部分介紹了,接下來,給出一個本節(jié)實驗的Makefile。請同學(xué)自行分析下面的Makefile并逐行注釋:# Makefile for eightqueen# make DEBUG 構(gòu)造調(diào)試版本# make 構(gòu)造優(yōu)化版本# make

26、clean 清除構(gòu)造生成的文件CC = gccAS = asEXEC = eightqueenOBJS = eightQueen.cMACRO =ifdef DEBUGASFLAGS = elseCFLAGS = -O2 endifINCLUDES = CRYPT = LIBDIR = all:compilecompile: eightQueen.c$(CC) -o eightqueen $(OBJS)debug: eightQueen.c$(CC) -g -o eightqueen $(OBJS)clean:rm ./ eightqueen#End Makefile3. 程序調(diào)試調(diào)試程序是編

27、程過程中重要的一個步驟。Linux下使用gdb來調(diào)試程序,注意,在調(diào)試之前,需要重新編譯一遍程序,把調(diào)試選項打開,執(zhí)行命令如下:gcc -g -o eightqueen eightQueen.c gdb eightqueen 屏幕回顯示如下信息:GNU gdb (Ubuntu 7.8-1ubuntu4) 7.8.0.20141001-cvsCopyright (C) 2014 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論