[hellogcc] [投稿]编译GDB

  • From: Hui Zhu <teawater@xxxxxxxxx>
  • To: hellogcc@xxxxxxxxxxxxx
  • Date: Tue, 7 Dec 2010 17:13:32 +0800

这次尝试才用一种新的BLOG发帖 大家都可以把要发到BLOG的文章投递到MAILLIST 然后大家REVIEW 等REVIEW的差不离了 再发到BLOG上
欢迎大家帮忙review

编译GDB
teawater@hellogcc


1. 取得源码
通常人们选择release的版本,可以直接到http://www.gnu.org/software/gdb/download/,这里介绍了各种下载地址,建议下载最新版本。;

当然我个人更推荐使用trunk,BUG这里最早修复,新功能这里最早会有,只是很偶尔会有编译出错的情况(今年我好像还没碰见过),大约过个1天也会有人修复。唯一的缺点是你需要经常更新你的GDB代码并编译安装他们,当然这其实也花不了多少时间。
取得trunk也可以通过下载的方式,ftp://sourceware.org/pub/gdb/snapshots/current/gdb.tar.bz2就是当前GDB的源码。;
当然如果经常更新的话,每次都下载十几M的源码包肯定比较麻烦,这时候最好就能用到版本控制工具来取得代码。GDB官方的版本控制使用的CVS,你可以用:
cvs -z9 -d :pserver:anoncvs@xxxxxxxxxxxxxx:/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编译非常简单,和编译大部分软件一样。
创建一个用来编译GDB的目录:
mkdir bgdb
进入这个目录:
cd bgdb
config,其中../gdb/是GDB源码的目录:
../gdb/configure
然后就是编译:
make
编译后安装:
make install
其中比较关键的地方就是config,其决定了后面编译出什么样的GDB。

如果想设置编译好的GDB到一个指定目录,可以用:
../gdb/configure  --prefix=$HOME
使用这个configure,可以让GDB安装到当前用户的home目录。

也可以在编译的时候指定CFLAGS,可以用:
../gdb/configure CFLAGS=-g
使用这个configure,编译出的GDB没有打开O2选项。


3.编译支持其他体系结构的GDB
前面介绍的config方式都是编译当前体系结构的,有时候我们需要在本机(X86)上跑一个支持别的体系结构的GDB,这样可以分析那个平台的二进制文件,CORE文件以及对那个平台的的程序进行远程调试。可以这样用:
../gdb/configure --target=amd64-linux
这样编译出的GDB就可以支持AMD64的GDB,编译安装的时候,GDB的执行文件会被命名为amd64-linux-gdb。

但是这样编译会有个小问题,如果需要使用多个体系结构的GDB,则需要每个平台都编译一个GDB,这有点麻烦,所以我比较喜欢使用的是另一种方法配置:
../gdb/configure --enable-targets=all --enable-64-bit-bfd
这样的GDB可以直接支持了全部全部他可以支持的体系结构和文件结构。
其中--enable-targets=all是让GDB打开对所有体系结构支持。
而--enable-64-bit-bfd是设置bfd为64位模式,这样才能支持64位的二进制文件比如说amd64,不过比较新的bfd中,当设置的target是64位或者打开--enable-targets=all的时候,不需要设置会自动打开这个选项,不过保险起见还是打开。
这样编译出的GDB就能支持GDB支持的全部体系结构了。
当然用起来有个问题就是,因为支持的体系结构太多,可能有一些二进制文件会同时符合若干种格式,打开这类文件的时候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.
这时你就可以根据提示,用set gnutarget format-name从列表中选择正确的格式,然后再用file命令打开这个文件,就可以了。


4.交叉编译
如果想在本地编译一个GDB而要在其他体系结构的平台上下使用,首先需要本地交叉编译环境可用,可以编译出可以在目标平台上运行的可执行文件,然后:
../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选项的时候,cvs会把源码仓库中所有文件都取回来,完成后src目录中不光有原来的目录,还增加了binutils,tk,
ld 等一大堆其他软件的目录。
如果你希望同时使用sourceware里面这些软件的最新版本,你可以使用这个源码树,如果你不想使用这样的源码树,则请直接看下一节。
我对这个目录建议的配置是:
../gdb/configure --disable-sid --disable-rda --disable-gdbtk
--enable-targets=all --enable-64-bit-bfd
其中--enable-targets=all --enable-64-bit-bfd上一节已经介绍过,不再介绍。
--disable-sid --disable-rda禁止了2个不太常用且编译比较慢的软件。
--disable-gdbtk禁止了GDB图形扩展insight的编译,其实这个软件还是相当好用的,这个图形扩展可以同时打开命令行,看源码的时候还能随时切换成汇编。但其有一个问题是跟GDB源码的联系其实非常紧密,一旦GDB一些源码作了更新,其的编译就会受到影响,再加上维护者不多,所以一旦编译不过就需要等上几天,这种情况一年能碰上几次,几率也不算很高。当然如果不介意的话,可以在config的时候去掉--disable-gdbtk,并安装包libx11-dev,编译如果发现问题可以报到邮件列表insight@xxxxxxxxxxxxxx,这样开发者可以更快的修复问题。


6.写在最后
前面介绍过的config参数可以同时使用,大家可根据需要灵活组合。

Other related posts: