1、從http://www.gnu.org/software/gdb/ 下載 gdb-6.8.tar.gz
2、tar -zxvf gdb-6.8.tar.gz 進行解壓後(這句是不是有點羅嗦了。。。嘿)
3、cd gdb-6.8/
4、./configure
注意!,這個腳本命令後面是帶參數的。如果不帶參數,則默認以源碼所在系統環境爲編譯環境。比如,我的虛擬機上的 REDHAT LINUX 是 i686-pc-linux-gnu ,如果需要一個 x86 平臺的 GDB ,那直接運行這個命令,然後再 make 就可以了。我試過,很輕易就編譯過了。
5、不過我需要的是兩個類型,一個是 mips 的 GDB ,一個是 mips 的 GDBSERVER ,還有一個是交叉編譯出來的配置爲 --host=i686-pc-linux-gnu --target=mipsel-linux 的 GDB 。這三個東西,mips 的 GDB 是用在非 GDBSERVER 模式下的。而以 --host=i686-pc-linux-gnu --target=mipsel-linux 配置編譯出來的 GDB 則作爲 GDBSERVER 模式的服務器端(因爲我虛擬機上的系統是x86的),而 mips 的GDBSERVER 在目標板上作爲客戶端。
6、首先
./configure --host=mipsel-linux --target=mipsel-linux CC=mipsel-linux-gcc
make
編譯中會提示 no termcap library found
google 一下,發現很多說法,搞的我頭大。其實很簡單,去下載一個 termcap-1.3.1 的包,因爲我們這裏是需要mips的靜態庫。所以也是一樣用上述的參數,編譯生成一個 libtermcap.a。具體編譯生成的方法就不細說了。要驗證是否生成了mips的庫,只要用 ar -x libtermcap.a 解開,然後用 file 命令查看 termcap.o 的類型是否爲 mips 即可。
然後,就是要把庫放到合適的位置,使make能夠找到這個庫。不過我是直接拷到 /usr/lib/ 下的。但是這樣還不行,make 一下,還是提示找不到。所以就搜了一下,是哪裏連接這個庫的。在 gdb/configure 腳本里有這樣一段:
case $host_os in
cygwin*)
if test -d $srcdir/libtermcap; then
LIBS="../libtermcap/libtermcap.a $LIBS"
ac_cv_search_tgetent="../libtermcap/libtermcap.a"
fi ;;
go32* | *djgpp*)
ac_cv_search_tgetent="none required"
;;
*mingw32*)
ac_cv_search_tgetent="none required"
CONFIG_OBS="$CONFIG_OBS win32-termcap.o"
;;
esac
我把這段都註釋掉。然後加上
ac_cv_search_tgetent="/usr/lib/libtermcap.a"
這邊就編譯過了。接着呢,
/usr/tools/mipsel-linux/include/sys/ptrace.h 又報語法錯。。。
這時候可以把 make 打印出的信息中的報錯部分的mipsel-linux-gcc ....的這部分拷貝下來。然後把 -c 參數改爲 -E 參數,進行預編譯。重定向到比如 1.txt 中。發現 ptrace.h 裏面的聯合 enum{ 1=1,...}那肯定會報錯了。可是怎麼會 "1=1" 呢。說明是有地方重複 define 了。
在 /usr/tools/ 下和 gdb 編譯目錄下,查找 PTRACE_TRACEME 字段。結果發現在 /usr/tools/mipsel-linux/include/linux 下也有個 ptrace.h 裏面 define 了 PTRACE_TRACEME 。用 -M 參數,打印出當前這個文件所引用的頭文件,確認這個 ptrace.h 也被包含了。解決辦法就是不要讓程序包含這個重複的頭文件。
搞定之後,繼續make。發現有warning被treat成erro,則所編譯文件下的makefile,將