1. 取得源碼
通常人們選擇release的版本,可以直接到http://www.gnu.org/software/gdb/download/,這里介紹了各種下載地址,建議下載最新版本。
當(dāng)然我個人更推薦使用trunk,BUG這里最早修復(fù),新功能這里最早會有,只是很偶爾會有編譯出錯的情況(今年我好像還沒碰見過),大約過個1天也會有人修復(fù)。唯一的缺點是你需要經(jīng)常更新你的GDB代碼并編譯安裝他們,當(dāng)然這其實也花不了多少時間。
取得trunk也可以通過下載的方式,ftp://sourceware.org/pub/gdb/snapshots/current/gdb.tar.bz2就是當(dāng)前GDB的源碼。
當(dāng)然如果經(jīng)常更新的話,每次都下載十幾M的源碼包肯定比較麻煩,這時候最好就能用到版本控制工具來取得代碼。GDB官方的版本控制使用的CVS,你可以用:
cvs -z9 -d :pserver:anoncvs@sourceware.org:/cvs/src co gdb
取得最新的GDB代碼,而在取得源碼用目錄中用:
cvs update
就可以更新源碼。
GDB也提供了GIT鏡像:
git clone git://sourceware.org/git/gdb.git
取得最新的GDB代碼,而在取得源碼用目錄中用:
git pull
就可以更新源碼。
2.基本編譯
編譯之前請安裝texinfo,libncurses5-dev, m4, flex 和 bison這5個包。
最基本的GDB編譯非常簡單,和編譯大部分軟件一樣。
創(chuàng)建一個用來編譯GDB的目錄:
mkdir bgdb
進入這個目錄:
cd bgdb
config,其中../gdb/是GDB源碼的目錄:
../gdb/configure
然后就是編譯:
make
編譯后安裝:
make install
其中比較關(guān)鍵的地方就是config,其決定了后面編譯出什么樣的GDB。
如果想設(shè)置編譯好的GDB到一個指定目錄,可以用:
../gdb/configure –prefix=$HOME
使用這個configure,可以讓GDB安裝到當(dāng)前用戶的home目錄。
也可以在編譯的時候指定CFLAGS,可以用:
../gdb/configure CFLAGS=-g
使用這個configure,編譯出的GDB沒有打開O2選項。
3.編譯支持其他體系結(jié)構(gòu)的GDB
前面介紹的config方式都是編譯當(dāng)前體系結(jié)構(gòu)的,有時候我們需要在本機(X86)上跑一個支持別的體系結(jié)構(gòu)的GDB,這樣可以分析那個平臺的二進制文件,CORE文件以及對那個平臺的的程序進行遠(yuǎn)程調(diào)試??梢赃@樣用:
../gdb/configure –target=amd64-linux
這樣編譯出的GDB就可以支持AMD64的GDB,編譯安裝的時候,GDB的執(zhí)行文件會被命名為amd64-linux-gdb。
但是這樣編譯會有個小問題,如果需要使用多個體系結(jié)構(gòu)的GDB,則需要每個平臺都編譯一個GDB,這有點麻煩,所以我比較喜歡使用的是另一種方法配置:
../gdb/configure –enable-targets=all –enable-64-bit-bfd
這樣的GDB可以直接支持了全部他可以支持的體系結(jié)構(gòu)和文件結(jié)構(gòu)。
其中–enable-targets=all是讓GDB打開對所有體系結(jié)構(gòu)支持。
而–enable-64-bit-bfd是設(shè)置bfd為64位模式,這樣才能支持64位的二進制文件比如說amd64,不過比較新的bfd中,當(dāng)設(shè)置的target是64位或者打開–enable-targets=all的時候,不需要設(shè)置會自動打開這個選項,不過保險起見還是打開。
這樣編譯出的GDB就能支持GDB支持的全部體系結(jié)構(gòu)了。
當(dāng)然用起來有個問題就是,因為支持的體系結(jié)構(gòu)太多,可能有一些二進制文件會同時符合若干種格式,打開這類文件的時候GDB會顯示:
“xxx”: not in executable format: File format is ambiguous.
Matching formats: elf32-bigmips elf32-bigmips-vxworks elf32-tradbigmips.
Use “set gnutarget format-name” to specify the format.
這時你就可以根據(jù)提示,用set gnutarget format-name從列表中選擇正確的格式,然后再用file命令打開這個文件,就可以了。
4.交叉編譯
如果想在本地編譯一個GDB而要在其他體系結(jié)構(gòu)的平臺上下使用,首先需要本地交叉編譯環(huán)境可用,可以編譯出可以在目標(biāo)平臺上運行的可執(zhí)行文件,然后:
../src/configure –host=mips64-linux –enable-64-bit-bfd
CC=mips64-linux-gcc LD=mips64-linux-ld AR=mips64-linux-ar
這樣GDB就能編譯出一個可以在mips64-linux上使用的GDB。
5.cvs update -d
前面提過更新CVS目錄,要使用cvs update,而cvs update
-d是不建議使用的命令,因為當(dāng)增加-d選項的時候,cvs會把源碼倉庫中所有文件都取回來,完成后src目錄中不光有原來的目錄,還增加了binutils,tk,
ld 等一大堆其他軟件的目錄。
如果你希望同時使用sourceware里面這些軟件的最新版本,你可以使用這個源碼樹,如果你不想使用這樣的源碼樹,則請直接看下一節(jié)。
我對這個目錄建議的配置是:
../gdb/configure –disable-sid –disable-rda –disable-gdbtk
–enable-targets=all –enable-64-bit-bfd
其中–enable-targets=all –enable-64-bit-bfd上一節(jié)已經(jīng)介紹過,不再介紹。
–disable-sid –disable-rda禁止了2個不太常用且編譯比較慢的軟件。
–disable-gdbtk禁止了GDB圖形擴展insight的編譯,其實這個軟件還是相當(dāng)好用的,
這個圖形擴展可以同時打開命令行,看源碼的時候還能隨時切換成匯編。但其有一個問題
是跟GDB源碼的聯(lián)系其實非常緊密,一旦GDB一些源碼作了更新,其的編譯就會受到影響,
再加上維護者不多,所以一旦編譯不過就需要等上幾天,這種情況一年能碰上幾次,幾率也
不算很高。當(dāng)然如果不介意的話,可以在config的時候去掉–disable-gdbtk,
并安裝包libx11-dev,編譯如果發(fā)現(xiàn)問題可以報到郵件列表insight@sourceware.org,
這樣開發(fā)者可以更快的修復(fù)問題。
6.寫在最后
前面介紹過的config參數(shù)可以同時使用,大家可根據(jù)需要靈活組合。