[hellogcc] Re: [hellogcc] Re: [hellogcc] [投稿]编译GDB

  • From: Hui Zhu <teawater@xxxxxxxxx>
  • To: hellogcc@xxxxxxxxxxxxx
  • Date: Tue, 14 Dec 2010 10:54:47 +0800

发在了 http://hellogcc.blogbus.com/logs/89007460.html

2010/12/9 Hui Zhu <teawater@xxxxxxxxx>:
> 貌似就这样了 要没哈问题我明天就发BLOG上了啊
>
> 2010/12/8 Hui Zhu <teawater@xxxxxxxxx>:
>> 谢谢YAO,已经FIX。
>>
>> Hui
>>
>> 编译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: