1. 程式人生 > >Linux下交叉編譯GDB

Linux下交叉編譯GDB

$ tar jxvf gdb-7.2.tar.bz2

小技巧:Linux下一般壓縮檔案字尾為.tar.bz2和.tar.gz,它們解壓命令有兩三個選項是一致的:

xf(v),前者再加上j選項,後者再加上z選項。

3、進入該目錄

$ cd gdb-7.2/

4、配置

$./configure --target=arm-linux --program-prefix=arm-linux- --prefix=/usr/armGDB

小技巧:--target=arm-linux意思是說目標平臺是運行於ARM體系結構的linux核心;--program-prefix=arm-linux-是指生成的可執行檔案的字首,比如arm-linux-gdb,--prefix

是指生成的可執行檔案安裝在哪個目錄,這個目錄需要根據實際情況作選擇。如果該目錄不存在,會自動建立,當然,許可權足夠的話。

5、編譯、安裝

$  make

注:這裡會出現make[3]: Entering directory `/root/gdb-7.2/gdb'等的資訊,不影響後續操作。。。

$ make install

同上

到此時會在--prefix指定的目錄下生成三個子目錄:bin、lib、share,我們需要的arm-linux-gdb就在其中的bin目錄下。大約14MB大,我們可以使用strip命令為它瘦身:

$ strip arm-linux-gdb -o arm-linux-gdb-stripped

$ ls -lh
總計 33M
-rwxr-xr-x 1 root root  14M 03-26 09:53 arm-linux-gdb
-rwxr-xr-x 1 root root  14M 03-26 09:53 arm-linux-gdbtui
-rwxr-xr-x 1 root root 2.8M 03-26 09:53 arm-linux-run
-rwxr-xr-x 1 root root 3.0M 03-26 09:57 arm-liunx-gdb-stripped

可以看到,strip後的檔案大小隻有3.0MB,這個檔案就是我們以後遠端除錯時在主機上執行的交叉偵錯程式了:在主機上執行,除錯的卻是另一種體系結構的程式碼。但是,光有主機的偵錯程式還不夠。還需要在目標板上執行一個叫gdbserver的二進位制檔案。

1、在剛才那個gdb解壓後的目錄:gdb-7.2,進入./gdb/gdbserver子目錄

cd gdb/gdbserver/
 pwd
/root/gdb-7.2/gdb/gdbserver

2、配置

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

這裡的--host指定了生成可執行檔案執行的平臺和系統:運行於ARM平臺的Linux系統
3、編譯

$  make 

一切如果沒有問題的話,會在當前目錄下生成gdbserver這個只有在ARM下執行的檔案。

注:網上絕大部分資料顯示,這裡的make會出錯,linux-arm-low.c:26:21:sys/reg.h:沒有那個檔案或目錄

make:***[linux-arm-low.o] Error 1。解決方法也簡單,在配置後(執行./configure後),將生成的config.h檔案中

#define HAVE_SYS_REG_H 1

語句註釋掉即可。
另外,也有資料說編譯gdbserver需要指定交叉編譯器(即執行make CC=arm-linux-gcc),但此處直接make,也沒問題。當然,交叉編譯器需要安裝好並設定好環境變數。我們看一下這個是什麼傢伙:

$ file gdbserver

gdbserver: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses 

shared libs), for GNU/Linux 2.6.14, not stripped

32位,ARM平臺,動態連結,未strip。
同樣,我們也減小它的體積:

$ arm-linux-strip gdbserver -o gdbserver-stripped

$ ls -lh | grep gdbserver

-rwxrwxr-x 1 root root  552K 03-26 10:03 gdbserver
-rw-rw-rw- 1 9176 65490 4.5K 2005-12-24 gdbserver.1
-rwxr-xr-x 1 root root  170K 03-26 10:05 gdbserver-stripped

注意,這裡必須使用strip的交叉版本,也就是arm-linux-strip

到此,我們生成了兩個重量級別的檔案:arm-linux-gdbgdbserver,我們需要將gdbserver下載到開發板中——可以通過各種各樣的手段,包括但不限於NFS。除錯時需要在開發板中執行這個程式,同時在主機中執行arm-linux-gdb偵錯程式。

4、除錯過程

目標板IP:192.168.1.12

宿主機IP:192.168.1.17
test為帶除錯資訊的測試程式

目標板上執行:./gdbserver 192.168.1.17:80000 test

宿主機上執行:arm-linux-gdb   //在/usr/armGDB/bin目錄下
target remote 192.168.1.12:80000

就可以使用gdb的命令除錯了。