官术网_书友最值得收藏!

1.4 搭建嵌入式開發(fā)環(huán)境

構(gòu)建開發(fā)環(huán)境是任何開發(fā)工作的基礎(chǔ),對于軟硬件非常豐富的嵌入式系統(tǒng)來說,構(gòu)建高效、穩(wěn)定的環(huán)境是能否開展工作的重要要素之一。本節(jié)將介紹嵌入式開發(fā)環(huán)境的建立方法,包括嵌入式的Linux操作系統(tǒng)Ubuntu16.04,主機與開發(fā)板的通信軟件,交叉編譯工具等的安裝和配置方法。

1.4.1 Ubuntu16.04的安裝

Ubuntu 支持各種形形色色的架構(gòu),包括 i386[386/486/Pentium(II/III/IV)和 Athlon/Duron/Sempron處理器],AMD64(Athlon64,Opteron,最新的64位Intel處理器)以及PowerPC(iBook/Powerbook, G4 and G5)等。Ubuntu相對其他Linux發(fā)行版的主要特點如下。

(1)基于Debian/Linux,使用APT包管理系統(tǒng)。

(2)相對于Fedora Code,APT包管理系統(tǒng)優(yōu)雅地解決了依賴問題,并且可以從容地在線安裝升級。

(3)相對于Debian,軟件更新積極,而Debian較保守。

(4)相對于Gentoo,基本無需編譯,省力、省時、省心。

本小節(jié)將介紹在VirtualBox管理器5.1.2中安裝Ubuntu 16.04,讀者可以在Ubuntu的官方網(wǎng)站http://www.ubuntu.com/download中獲取最新版的Ubuntu鏡像文件。

在安裝VirtualBox后,可以按照如下步驟安裝Ubuntu。

(1)打開VirtualBox,可以看到圖1-1所示的界面。

(2)單擊“新建”按鈕后會出現(xiàn)圖1-2所示的界面,一般按照圖中所示填寫,版本根據(jù)讀者下載的是32bit或64bit選擇。

圖1-1 打開VirtualBox后的界面

圖1-2 虛擬機系統(tǒng)名稱填寫

(3)接下來是配置內(nèi)存,如圖1-3所示,內(nèi)存大小可以選擇默認,也可以根據(jù)實際情況填寫。剩下的可以選擇默認,直接單擊“下一步”按鈕。當(dāng)出現(xiàn)虛擬硬盤時,文件位置及硬盤大小可以根據(jù)實際情況選擇。單擊“創(chuàng)建”按鈕后,則創(chuàng)建虛擬機環(huán)境完成,如圖1-4所示。

圖1-3 內(nèi)存大小的選擇

圖1-4 創(chuàng)建虛擬環(huán)境后的界面

(4)創(chuàng)建完成后,單擊“設(shè)置”按鈕,如圖1-5所示,加載ISO鏡像文件。然后單擊“啟動”,會開機進入圖1-6所示的界面。選擇“中文(簡體)”,單擊“安裝Ubuntu”按鈕,開始安裝Ubuntu。

圖1-5 加載ISO鏡像文件

圖1-6 安裝Ubuntu歡迎界面

(5)進入準(zhǔn)備安裝Ubuntu界面,按照圖1-7所示選擇即可,單擊“繼續(xù)”按鈕,進入圖1-8所示的界面進行選擇。

圖1-7 準(zhǔn)備安裝Ubuntu界面

圖1-8 安裝類型選擇

(6)接下來單擊“現(xiàn)在安裝”按鈕,進入時區(qū)選擇界面,選擇“shanghai”,如圖1-9所示。單擊“繼續(xù)”按鈕,就進入鍵盤布局界面,選擇“漢語”,如圖1-10所示。

圖1-9 時區(qū)選擇界面

圖1-10 鍵盤布局選擇

(7)按照圖1-10選擇后,進入用戶名及密碼設(shè)置界面,如圖1-11所示。用戶名及密碼根據(jù)讀者自己需要設(shè)置。設(shè)置完成后,進入安裝界面中,如圖1-12所示,等待一段時間,即可安裝完畢。

圖1-11 用戶名及登錄密碼設(shè)置

圖1-12 安裝界面

(8)在VirtualBox配置的過程中,網(wǎng)絡(luò)已經(jīng)默認選擇好了,如圖1-13所示,按照默認的選擇, Ubuntu安裝完成后,只要宿主機能夠上網(wǎng),虛擬機就能上網(wǎng)。

這樣就完成了系統(tǒng)的安裝,如圖1-14所示。下面還將安裝和設(shè)置一些常用的工具。

圖1-13 網(wǎng)絡(luò)設(shè)置

圖1-14 安裝完成后的系統(tǒng)桌面

1.4.2 Minicom的安裝配置

Minicom是一款串口通信軟件,在嵌入式開發(fā)領(lǐng)域應(yīng)用十分廣泛。類似的軟件還有Windows下的超級終端(Hyperterminal),Linux下的kermit等。它們之間的區(qū)別很小,基本上可以互換,選擇適合自己的就可以了。

1.安裝Minicom

在Ubuntu下安裝Minicom的方法很簡單。正確設(shè)置網(wǎng)絡(luò)后,打開終端,輸入如下命令。

$sudo apt-get install Minicom

鍵入上述命令按Enter鍵后,得到圖1-15所示界面。輸入y并按Enter鍵,開始安裝Minicom,如圖1-16所示。

圖1-15 獲取安裝包

圖1-16 安裝Minicom

2.配置Minicom

Minicom是在終端下運行的程序,可以通過它配置界面來配置其工作特性。第一次使用前,通常都需要做一次配置。在shell下執(zhí)行命令:

$Minicom -s

出現(xiàn)圖1-17所示的配置界面。

在圖1-17所示的菜單中,可以先通過光標(biāo)移動鍵選擇菜單項,然后再按 Enter 鍵進入子菜單項。選擇第三個菜單項,即“Serial port setup”,根據(jù)目標(biāo)板的串口通信參數(shù)設(shè)置。進入圖1-18所示的配置界面。這些配置項前的大寫字母為該配置項的快捷鍵,要配置某個配置項可以通過相應(yīng)的按鍵選擇該配置項,然后再做修改。

圖1-17 Minicom的配置界面

例如,按A鍵修改使用的串口設(shè)備,其中:“/dev/ttyS0”表示串口1,“/dev/ttyS1”表示串口2。修改完這一項,按Esc鍵返回。通常串口通信速率(E-Bps/Par/Bits)和硬件流控(F-Hardware Flow Control)也要設(shè)置為圖1-18中所設(shè)置的那樣。

參數(shù)設(shè)置完成后,按Enter鍵返回圖1-17所示的主配置菜單。移動光標(biāo)至“Sava setup as dfl”菜單項,按Enter鍵保存為默認配置。最后,選擇“Exit from Minicom”命令退出。

再次啟動Minicom時,直接在shell下執(zhí)行Minicom命令就可以進入Minicom的控制臺。在控制臺下通過組合鍵Ctrl+A+Z可以進入Minicom菜單,如圖1-19所示。

圖1-18 Minicom串口參數(shù)配置界面

圖1-19 Minicom命令菜單

1.4.3 Tftp服務(wù)的安裝配置

Tftp協(xié)議是簡單文件傳輸協(xié)議,基于UDP協(xié)議,沒有文件管理、用戶控制等功能,因此實現(xiàn)起來簡單易行,使用方便,正好適合目標(biāo)板的Boot Loader等使用。Tftp分為服務(wù)器端程序和客戶端程序,在主機上通常同時配置有Tftp服務(wù)端和客戶端。這里主要介紹服務(wù)端的配置方法。默認安裝的Ubuntu系統(tǒng)沒有包含Tftp的服務(wù)端和客戶端,可以采取命令行的形式獲取,步驟如下。

(1)安裝客戶端。

$sudo apt-get install tftp

(2)安裝服務(wù)端。

$sudo apt-get install tftpd

(3)安裝inetd。

$sudo apt-get install netkit-inetd

說明:inetd是監(jiān)視一些網(wǎng)絡(luò)請求的守護進程,其根據(jù)網(wǎng)絡(luò)請求來調(diào)用相應(yīng)的服務(wù)進程來處理連接請求。inetd可以為多種服務(wù)管理連接,當(dāng)它接到連接時,它能夠確定連接所需的程序,啟動相應(yīng)的進程,并把socket交給程序(服務(wù)器socket將作為程序的標(biāo)準(zhǔn)輸入、輸出和錯誤輸出描述符)。使用inetd來運行那些負載不重的服務(wù)有助于降低系統(tǒng)負載,因為它不需要為每個服務(wù)都啟動獨立的服務(wù)程序。

(4)在“/”目錄下建一個tftpboot,把屬性改成777。

$cd /

$sudo mkdir tftpboot

$sudo chmod 777 tftpboot

(5)在/etc/inetd.conf里進行添加。

#tftpd dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /tftpboot

(6)重新加載inetd進程。

$sudo /etc/init.d/inetd reload

(7)Tftp服務(wù)器就安裝完成了,下面測試一下。在/tftpboot文件夾下新建立一個文件。

$cd /tftpboot

$touch aaa

(8)進入另外一個文件夾。

$cd~

$tftp localhost

$tftp> get aaa

Tftp便配置完成了。

1.4.4 NFS的安裝配置

網(wǎng)絡(luò)文件系統(tǒng)(Network File System,NFS)是一種將遠程主機上的分區(qū)(目錄)經(jīng)網(wǎng)絡(luò)掛載到本地系統(tǒng)的一種機制,通過對網(wǎng)絡(luò)文件系統(tǒng)的支持,用戶可以在本地系統(tǒng)上像操作本地分區(qū)一樣來對遠程主機的共享分區(qū)(目錄)進行操作。

在嵌入式Linux的開發(fā)過程中,開發(fā)者需要在Linux服務(wù)器上進行所有的軟件開發(fā),交叉編譯后,通過FTP方式將可執(zhí)行文件下載到嵌入式系統(tǒng)運行,但這種方式不但效率低下,且無法實現(xiàn)在線的調(diào)試。因此,可以通過建立NFS,把Linux服務(wù)器上的特定分區(qū)共享到待調(diào)試的嵌入式目標(biāo)系統(tǒng)上,這樣就可以直接在嵌入式目標(biāo)系統(tǒng)上操作Linux服務(wù)器,同時可以在線對程序進行調(diào)試和修改,大大方便了軟件的開發(fā)。因此,NFS是嵌入式Linux開發(fā)的一個重要的組成部分,本部分內(nèi)容將詳細說明如何配置NFS開發(fā)環(huán)境。NFS開發(fā)環(huán)境的實現(xiàn)包括兩個方面。

(1)Linux服務(wù)器端的NFS服務(wù)器支持。

(2)嵌入式目標(biāo)系統(tǒng)的NFS客戶端的支持。

因此,NFS開發(fā)環(huán)境的建立需要配置Linux服務(wù)器端和嵌入式目標(biāo)系統(tǒng)端。

在Ubuntu系統(tǒng)下,使用NFS需要首先安裝以下NFS的軟件包。

(1)服務(wù)器端:nfs-common、nfs-kernel-server、portmap。

(2)客戶端:nfs-common、portmap。

安裝服務(wù)器端軟件包的命令是:

$sudo apt-get install nfs-kernel-server

安裝nfs-kernel-server時,apt會自動安裝nfs-common和portmap。剛安裝好的NFS還不能提供實際的服務(wù),需要配置共享目錄的路徑和訪問權(quán)限。NFS 的配置文件是/etc/exports。這個文件的內(nèi)容非常簡單,每一行由拋出路徑、客戶名列表以及每個客戶名后緊跟的訪問選項構(gòu)成,如下所示:

[共享的目錄] [主機名或IP(參數(shù),參數(shù))]

其中參數(shù)是可選的。當(dāng)不指定參數(shù)時,NFS將使用默認選項。默認的共享選項是:

sync,ro,root_squash,no_delay

當(dāng)主機名或IP地址為空時,則代表共享給任意客戶機提供服務(wù)。當(dāng)將同一目錄共享給多個客戶機,但對每個客戶機提供的權(quán)限不同時,可以這樣:

[共享的目錄] [主機名1或IP1(參數(shù)1,參數(shù)2)] [主機名2或IP2(參數(shù)3,參數(shù)4)]

表1-1列出了一些NFS共享的常用參數(shù)。

表1-1 NFS共享的常用參數(shù)

續(xù)表

舉例說明如下:

/home/share 192.168.1.15(rw,sync) *(ro)

配置說明:對IP地址為192.168.1.15的客戶端賦予讀寫權(quán)限,其他IP地址的客戶端僅有只讀權(quán)限。

/home/share 192.168.1.*(rw,sync,no_root_squash)

配置說明:允許IP地址范圍在192.168.1.*的計算機以讀寫的權(quán)限來訪問/home/share目錄。

/home/share *(rw,no_root_squash)

配置說明:/home/share目錄允許所有的IP以讀寫的權(quán)限來訪問。

最后執(zhí)行啟動NFS服務(wù)的命令。命令如下。

$sudo /etc/init.d/nfs-kernel-server start

停止和重啟服務(wù),命令分別如下。

$sudo /etc/init.d/nfs-kernel-server stop

$sudo /etc/init.d/nfs-kernel-server restart

在NFS服務(wù)器啟動后,還需要檢查Linux服務(wù)器的防火墻等設(shè)置(一般需要關(guān)閉防火墻服務(wù)),確保沒有屏蔽掉NFS使用的端口和允許通信的主機,主要是檢查Linux服務(wù)器iptables、ipchains等選項的設(shè)置,以及/etc/hosts.deny、/etc/hosts.allow文件。通常都是在內(nèi)部局域網(wǎng)中進行開發(fā),在安裝系統(tǒng)時最好不要安裝防火墻等網(wǎng)絡(luò)安全軟件,以方便使用時的配置。

首先在Linux服務(wù)器上進行NFS服務(wù)器的回環(huán)測試,驗證共享目錄是否能夠被訪問。在Linux服務(wù)器上運行如下命令:

$ mount–t nfs 192.168.1.1:/home/share /mnt

如果沒有錯誤發(fā)生,再運行如下命令:

$ ls /mnt

該命令將Linux服務(wù)器的NFS輸出共享目錄掛載到/mnt目錄下,因此,如果NFS正常工作,應(yīng)該能夠在/mnt目錄看到/home/share共享目錄中的內(nèi)容。

在Linux服務(wù)器設(shè)置好后,還需要對目標(biāo)板系統(tǒng)進行相關(guān)配置。在移植內(nèi)核時需要添加內(nèi)核對NFS的支持,在內(nèi)核的編譯選項中,選中“networking options”“IP:kernel level autoconfiguralion”項;選中“file systems”“network file systems”“root file system on nfs”和“nfs file system support”。重新編譯內(nèi)核,將Boot Loader和kernel下載到開發(fā)板上。

啟動開發(fā)板后,在目標(biāo)系統(tǒng)的Linux Shell下,首先建立Linux服務(wù)器輸出共享目錄的掛載點:

$mkdir /mnt/nfs

執(zhí)行如下命令來進行NFS共享目錄掛載。

$mount–t nfs 192.168.1.1:/home/share /mnt/nfs–o nolock

mount命令中的參數(shù)192.168.1.1為Linux服務(wù)器的IP地址,/home/share為Linux服務(wù)器端所配置的共享輸出目錄,/mnt/nfs為嵌入式設(shè)備上的本地目錄。

然后進入該目錄,并列出該目錄下的文件,命令操作如下所示。

$cd /mnt/nfs

$ls

此時,在目標(biāo)系統(tǒng)端所顯示的內(nèi)容即為Linux服務(wù)器的輸出目錄的內(nèi)容,即Linux服務(wù)器的輸出目錄/home/share 通過 NFS映射到了嵌入式目標(biāo)系統(tǒng)的/mnt/nfs 目錄,可以像對待本地的目錄一樣來對待NFS的共享目錄了。用戶可以用增加、刪除和修改文件的方式來驗證實際效果。

1.4.5 建立交叉工具鏈

交叉工具鏈?zhǔn)怯脕硗瓿山徊婢幾g的工具包,這里簡要介紹其構(gòu)建的基本方法。

1.設(shè)置用戶環(huán)境

設(shè)置用戶環(huán)境的步驟如下。

(1)添加工作用戶(在root用戶下)。

$useradd -G root -g root -d/home/ARM ARM

$mkdir -p /home/ARM

$chown -R ARM /home/ARM

$chmod -R 775 /home/ARM

(2)建立工作目錄(用ARM用戶登錄)。

$ mkdir dev_home

$ cd dev_home

$ mkdir btools kernel

(3)登錄時啟動環(huán)境變量(用root用戶登錄)。

$ vi~/.bashrc

在.bashrc最后加上:

export PATH=/usr/local/ARM/6.1.0/bin:$PATH

重新登錄ARM用戶,環(huán)境變量生效。

$ su ARM

2.編譯工具鏈

首先需要設(shè)置環(huán)境變量,如下所示:

$ vi~/.bashrc

export divFIX=/usr/local/ARM/6.1.0

export TARGET=ARM-linux

export SYSROOT=${divFIX}/sysroot

export ARCH=ARM

export CROSS_COMPILE=${TARGET}

export PATH=${divFIX}/bin:$PATH

export SRC=/home/ARM/dev_home/btools/tchain6.1.0

注意

如果已經(jīng)安裝過ARM-linux-gcc,并且已經(jīng)加入到環(huán)境變量中,則應(yīng)將其從環(huán)境中去掉,保證root用戶和ARM用戶環(huán)境中沒有ARM-linux-gcc。

(1)準(zhǔn)備源碼包如表1-2所示。

表1-2 工具鏈所需的源碼包

(2)準(zhǔn)備補丁。上述的源碼在進行編譯時會出一些問題,還需稍做修改。

首先下載補丁 ioperm.c.diff,該補丁的作用是修正 ioperm()函數(shù)的一個 BUG。該補丁的下載地址為:http://frank. harvard.edu/~coldwell/toolchain/ioperm.c.diff。

然后下載補丁 flow.c.diff,該補丁的作用是修改 gcc 一處 BUG。該補丁的下載地址是:http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-ARM-branch&r1=1.563.4.2&r2=1.563.4.3。

最后一個補丁是t-linux.diff,該補丁的作用是用于產(chǎn)生crti.o和crtn.o文件,該補丁的下載地址為:http://frank.harvard.edu/~coldwell/toolchain/t-linux.diff。

(3)編譯GNU binutils,重新以ARM用戶登錄,讓新設(shè)置的環(huán)境變量起作用。

$ su ARM

$ cd ${SRC}

$ tar zxvf binutils-2.27.tar.gz

$ mkdir -p BUILD/binutils-2.27

$ cd BUILD/binutils-2.27

$ ../../binutils-2.27/configure --divfix=${divFIX} --target=${TARGET} --with-sysroot=${SYSROOT}

$ make

$make install

(4)準(zhǔn)備內(nèi)核頭文件。使用當(dāng)前平臺的gcc編譯內(nèi)核頭文件。

$ cd ${KERNEL}

$ tar zxvf ../btools/tchain6.1.0/linux-4.6.5.tar.gz

$ cd linux-4.6.5/

$ cp arch/ARM/configs/smdk2410_defconfig .config

因為本書介紹的 CPU 是 S3C2440,所以選擇了一個配置文件 smdk2410_defconfig。通過menuconfig選擇配置文件。

$ make ARCH=ARM menuconfig

選擇后保存退出。

$ make

(5)復(fù)制內(nèi)核頭文件,指令如下所示。

$ mkdir -p ${SYSROOT}/usr/include

$cp -a include/linux ${SYSROOT}/usr/include/linux

$ cp -a include/asm-ARM ${SYSROOT}/usr/include/asm

$ cp -a include/asm-generic ${SYSROOT}/usr/include/asm-generic

(6)編譯glibc頭文件,指令如下所示。

$ cd ${SRC}

$ tar zxvf glibc-2.24.tar.gz

$ patch -d glibc-2.24 -p1 < ioperm.c.diff

$ cd glibc-2.3.5

$ tar jxvf ../ glibc-linuxthreads-2.5.tar.bz2

$ cd ..

$ mkdir -p BUILD/glibc-2.5-headers

$ cd BUILD/glibc-2.5-headers/

$../../glibc-2.5/configure --divfix=/usr --host=${TARGET} --enable-add-ons= linuxt hreads --with-headers=${SYSROOT}/usr/include

$make cross-compiling=yes install_root=${SYSROOT} install-headers

$touch ${SYSROOT}/usr/include/gnu/stubs.h

$touch ${SYSROOT}/usr/include/bits/stdio_lim.h

(7)編譯gcc第一階段,指令如下所示。

$ cd ${SRC}

$ tar jxvf gcc-6.1.0.tar.bz2

$ patch -d gcc-6.1.0 -p1 < flow.c.diff

$ patch -d gcc-6.1.0 -p1 < t-linux.diff

$ mkdir -p BUILD/gcc-6.1.0-stage1

$ cd BUILD/gcc-6.1.0-stage1/

$ ../../gcc-6.1.0/configure --divfix=${divFIX} --target=${TARGET} --enable- languages=c --with-sysroot=${SYSROOT}

注意

不能加上--disable-shared

$ make all-gcc

$ make install-gcc

(8)編譯完整的glibc,指令如下所示。

$ cd ${SRC}

$ mkdir -p BUILD/ glibc-2.24

$ cd BUILD/glibc-2.24

$BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar RANLIB=${CROSS_COMPILE}ranlib AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld ../../glibc-2.24/configure–divfix =/usr--build=i386-ubuntu-linux --host=ARM-unknown-linux-gnu --target=ARM-unknown- linux-gnu--without-__thread --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/ usr/include

參數(shù)說明如下。

● --divfix:指定安裝路徑。

● --target:指定目標(biāo)平臺。

● --host:指定當(dāng)前平臺。

● --build:指定編譯平臺。

● --with-sysroot:用于指定編譯所需要的頭文件及鏈接庫。

● --enable-add-ons:加入其他的庫,如線程庫等。

● --enable-languages:指定gcc所支持的語言。

$ make

$ make install_root=${SYSROOT} install

(9)編譯完整的gcc,指令如下所示。

$ cd ${SRC}

$ mkdir -p BUILD/gcc-6.1.0

$ cd BUILD/gcc-6.1.0

$../../gcc-6.1.0/configure --divfix=${divFIX} --target=${TARGET} --with-sysroot=${SYSROOT} --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --with-softfloat-support=internal --enable-languages=c,c --enable-shared–enable-c99 --enable-long-long

$ make

$ make install

$ ARM-linux-gcc -v

Reading specs from /usr/local/ARM/6.1.0/lib/gcc/ARM-linux/6.1.0/specsConfigured with:../../gcc-6.1.0/configure --divfix=/usr/local/ARM/6.1.0 --target=ARM-linux–with -sysroot=/usr/local/ARM/6.1.0/sysroot --disable-nls --enable-threads=posix --enable- symvers=gnu -enable-__cxa_atexit --with-softfloat-support=internal --enable-languages =c,c --enableshared --enable-c99 --enable-long-long

Thread model: posix

gcc version 6.1.0

$ ls

ARM-linux-addr2line ARM-linux-c filt ARM-linux-gcc-6.1.0 ARM-linux-nm ARM-linuxreadelf

ARM-linux-ar ARM-linux-cpp ARM-linux-gccbug ARM-linux-objcopy ARM-linux-size

ARM-linux-as ARM-linux-g ARM-linux-gcov ARM-linux-objdump ARM-linux-strings

ARM-linux-c ARM-linux-gcc ARM-linux-ld ARM-linux-ranlib ARM-linux-strip

為了確保編譯的gcc能正常工作,需要對它們進行測試,主要的步驟如下。

(1)編寫C語言文件,代碼如下。

$ vi hello_c.c

#include<stdio.h>

#include<stdlib.h>

int main()

{

printf("Hello,World~\n");

return 0;

}

(2)編寫CPP語言文件,代碼如下。

$ vi hello_cpp.cpp

#include<iostream>

using std::cout;

using std::endl;

int main()

{

cout<<"Hello,World!\n"<<endl;

return 0;

}

(3)交叉編譯文件,代碼如下。

$ ARM-linux-gcc hello_c.c -o hello_c

$ ARM-linux-g -o hello_cpp hello_cpp.cpp

$ file hello_c

hello_c: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 4.6.0, dynamically linked (uses shared libs), for GNU/Linux 4.6.0, not stripped

$ file hello_cpp

hello_cpp: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 4.6.0, dynamically linked (uses shared libs), for GNU/Linux 4.6.0, not stripped

沒有出現(xiàn)任何錯誤,說明編譯的gcc可以正常工作。

下面編譯主機上運行的gdb,這個過程比較簡單,指令如下。

$ tar zxvf gdb-7.11.tar.gz

$ mkdir -p BUILD/gdb-7.11-host

$ cd BUILD/gdb-7.11-host

$ export CC=gcc

$ ../../gdb-7.11/configure --target=ARM-linux

$ make

$ file gdb/gdb

gdb/gdb: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 4.6.0, dynamically linked (uses shared libs), for GNU/Linux 4.6.0, not stripped

另外有時需要進行遠程調(diào)試,因此還需要建立目標(biāo)平臺上運行的gdbserver,指令如下。

$ mkdir -p ../gdbserver-7.11

$ cd ../gdbserver-7.11

$ export CC=/usr/local/ARM/6.1.0/bin/ARM-linux-gcc

$ ../../gdb-7.11/gdb/gdbserver/configure --host=ARM-linux

$ make

$ file gdbserver

gdbserver: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 4.6.0, dynamically linked (uses shared libs), for GNU/Linux 4.6.0, not stripped

3.工具鏈的下載

有些常用的工具鏈并不需要自己從頭編譯,網(wǎng)上已經(jīng)有了現(xiàn)成的,只需下載后按指定的目錄解壓就可以了。工具鏈的官方下載地址如下所示。

http://www.ARM.linux.org.uk/:

ftp://ftp.ARM.linux.org.uk/pub/ARMlinux/toolchain/cross-2.95.3.tar.bz2:

ftp://ftp.ARM.linux.org.uk/pub/ARMlinux/toolchain/cross-3.0.tar.bz2:

ftp://ftp.handhelds.org/projects/toolchain/ARM-linux-gcc-3.3.2.tar.bz2:

ftp://ftp.handhelds.org/projects/toolchain/ARM-linux-gcc-3.4.1.tar.bz2:

http://ftp.snapgear.org/pub/snapgear/tools/ARM-linux/gcc-3.4.4.tar.bz2:

主站蜘蛛池模板: 绩溪县| 玉屏| 电白县| 永州市| 湾仔区| 逊克县| 舟山市| 盐城市| 南昌县| 通州市| 安达市| 阜新市| 噶尔县| 廉江市| 中方县| 凌海市| 名山县| 辉县市| 乐都县| 昭平县| 阜新市| 博乐市| 怀化市| 叶城县| 宁陵县| 抚宁县| 浦县| 阿勒泰市| 东海县| 岳阳市| 巴里| 新干县| 囊谦县| 泰兴市| 乳山市| 浦县| 错那县| 个旧市| 聂拉木县| 观塘区| 榆中县|