在Fedora12上编译安装gdb-7.2:编译安装gdb和gdbserver
1. 下载gdb7.2: ftp://sourceware.org/pub/gdb/releases/gdb-7.2a.tar.bz2
2. 编译安装gdb
2.1 解压:
[zcm@~ #1]$cd /mnt/hgfs/opensource/ [zcm@opensource #2]$ls a52dec ffmpeg-1.2.3 libavc1394-0.5.4 libmad-0.15.1b libxcb-1.6 RTSP__live555 xcb-proto-1.6 build.sh gdb-7.2a.tar.bz2 libbluray-0.3.0 libpthread-stubs-0.3 linux-2.6.31.5 util-keysyms-0.3.6 doxygen-1.8.5 install-tl-20130904 libdc1394-2.2.1 libraw1394-2.0.5 live vlc-2.0.5 [zcm@opensource #3]$tar -jxvf gdb-7.2a.tar.bz2 gdb-7.2/README gdb-7.2/Makefile.in gdb-7.2/configure ......
2.2 编译并安装
首先进入gdb解压后的目录:cd gdb-7.2
下面这个脚本是我自己整理的,包含了编译安装的一系列过程。但是在具体编译安装时我会选择分步执行,一方面为了安全,另一方面就是当有错误出现时能及时地看到。
编译安装时主要是通过修改脚本中n的值或是注释一些语句来完成!
#!/bin/sh n=1 if [ $n -eq 0 ]; then TARGET_DIR=/opt/arm-gdb-7.2 mkdir -p $TARGET_DIR chown -R zcm:zcm $TARGET_DIR ./configure --prefix=$TARGET_DIR --target=arm-arago-linux-gnueabi else make #make install # do uninstall #find . -name Makefile | xargs -i make -f {} uninstall fi
脚本的内容相信大家都看得明白,我也就不作解释了!
3. 编译并安装gdbserver
[[email protected] #18]$cd gdb/gdbserver/ [zcm@gdbserver #19]$ls build.sh build.sh [zcm@gdbserver #20]$cat build.sh #!/bin/sh n=1 if [ $n -eq 0 ]; then TARGET_DIR=/opt/arm-gdbserver-7.2 mkdir -p $TARGET_DIR chown -R zcm:zcm $TARGET_DIR ./configure --prefix=$TARGET_DIR --target=arm-arago-linux-gnueabi --host=arm-arago-linux-gnueabi else make CC=arm-arago-linux-gnueabi-gcc #make install fi [zcm@gdbserver #21]$
但是在安装时却出现错误:/usr/bin/install: cannot stat `libinproctrace.so': No such file or directory
经上网搜索找到答案,只要修改Makefile.in文件中的第167行即可,改为“if [ x${IPA_DEPFILES} != x ]; then \”
因为Makefile是在执行configure时引入Makefile.in后创建的,这样修改后,下次再执行configure也不会再出错了!
参考网址:
http://blog.chinaunix.net/uid-22525389-id-160160.html
http://www.cppblog.com/zhangyq/archive/2010/09/02/125464.html
4. 环境变量的配置(略)
补充说明:
在使用编译出来的gdb进行交叉调试时,发现经常会出现:“Remote 'g' packet reply is too long ”这个错误。在网上搜索后找到答案:
需要修改gdb-7.2/gdb/remote.c文件,将第5686行:
if (buf_len > 2 * rsa->sizeof_g_packet)
error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);
修改为:
if (buf_len > 2 * rsa->sizeof_g_packet) { rsa->sizeof_g_packet = buf_len; for(i = 0; i < gdbarch_num_regs(gdbarch); i++) { if(rsa->regs[i].pnum == -1) continue; if(rsa->regs[i].offset >= rsa->sizeof_g_packet) rsa->regs[i].in_g_packet = 0; else rsa->regs[i].in_g_packet = 1; } //error (_("Remote 'g' packet reply is too long: %s"), rs->buf); }
参考网址:http://hi.baidu.com/285988185/item/33cc0e047be026e6fe240d4c