1. 程式人生 > >編譯gdb和gdbserve的方法

編譯gdb和gdbserve的方法

說明

gdb一份程式碼裡包含兩個程式,一個是gdb,一個是gdbserver,分別執行在PC主機和開發板上,編譯的時候得分開編譯。

準備材料

作業系統:ubuntu-16.04.4-desktop-i386

本地編譯器:gcc v5.4.0(ubuntu原配)

交叉編譯器:arm-linux-gcc v3.4.5

gdb原始碼:gdb-7.5.tar.bz2(gdb下載地址)

gdb和gdbserver我已經編譯好了,在這裡:百度網盤,密碼: v36n

編譯gdb

進入gdb的原始碼目錄,配置gdb:

gdb-7.5$ ./configure --target=arm-linux
gdb-7.5$ make

出現一個錯誤:

opncls.c: In function ‘bfd_fopen’:
bfd.h:529:65: error: right-hand operand of comma expression has no effect [-Werror=unused-value]
 #define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = bool), TRUE)

重新配置一次,忽略這種函式命名不規範導致的錯誤:

gdb-7.5$ ./configure --target=arm-linux --disable-werror

再次make後又出現錯誤:

checking for library containing waddstr... no
configure: WARNING: no enhanced curses library found; disabling TUI
checking for library containing tgetent... no
configure: error: no termcap library found
Makefile:8370: recipe for target 'configure-gdb' failed
make[1]: *** [configure-gdb] Error 1
make[1]: Leaving directory '/home/sam/Work/gdb/gdb-7.5'
Makefile:844: recipe for target 'all' failed
make: *** [all] Error 2

安裝libncureses5-dev:

gdb-7.5$ sudo apt-get install libncurses5-dev

再次make,通過了。此時gdb位於:gdb-7.5/gdb/gdb。你可以執行make install把gdb安裝到/usr/local/bin/裡去,由於ubuntu自帶了一個gdb,我沒有這樣做,而是後續自己手動加入,並改了個名,以區分ubuntu自帶的那個gdb。

然而,gdbtui並沒有編譯出來,我也不知道為什麼,但是我編譯gdb-7.4.1是可以的。

編譯gdbserver

進入gdbserver所在目錄:gdb-7.5/gdb/gdbserver,配置gdbserver:

gdb-7.5/gdb/gdbserver$ ./configure --target=arm-linux --host=arm-linux

--host=arm-linux意思是你的交叉編譯器的字首是arm-linux,如果你的交叉編譯器叫arm-none-linux-gnueabi-gcc,那麼這裡應該填--host=arm-none-linux-gnueabi。

make後出現錯誤:

linux-arm-low.c: In function `arm_stopped_by_watchpoint':
linux-arm-low.c:643: error: `PTRACE_GETSIGINFO' undeclared (first use in this function)
linux-arm-low.c:643: error: (Each undeclared identifier is reported only once
linux-arm-low.c:643: error: for each function it appears in.)
Makefile:222: recipe for target 'linux-arm-low.o' failed
make: *** [linux-arm-low.o] Error 1

意思是PTRACE_GETSIGINFO這個巨集沒有定義,這個巨集其實位於交叉編譯器的安裝目錄裡:

gcc-3.4.5-glibc-2.3.6$ grep -nrR PTRACE_GETSIGINFO
arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO	0x4202
arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO	0x4202
distributed/arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO	0x4202
distributed/arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO	0x4202

修改linux-arm-low.c這個檔案,新增#include <linux/ptrace.h>

/* Don't include elf.h if linux/elf.h got included by gdb_proc_service.h.
   On Bionic elf.h and linux/elf.h have conflicting definitions.  */
#ifndef ELFMAG0
#include <elf.h>
#endif
#include <sys/ptrace.h>
#include <signal.h>

#include <linux/ptrace.h>
再次make,通過了。