使用GDB源码进行交叉编译

 

 

首先,先来段闲话。算是本篇的背景

    最近发现我们部门目前在ATI平台上用的 GDB 版本太旧了。大概是01年左右的版本----GDB 5.0.91

    在使用这个版本的GDB调试的时候,如果异常是在子线程发生的,则GDB无法跟踪其代码路径。我也不知道是不是版本太低的缘故,反正就抽空下载了最新版本“GDB 6.8 ” 在我的虚拟机上进行交叉编译。

 

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,将

WERROR_CFLAGS = -Werror  

注释掉。

这次编译成功后,就生成了 mips 的 GDB 和 GDBSERVER。

接着重新进行配置编译  

  ./configure --host=i686-pc-linux-gnu --target=mipsel-linux 

这次编译要把刚才改libtermcap.a的路径的地方再改回去。然后make ,可能make的时候有些地方报错,设置编译的时候coredump,一般是因为链接了一个非指定的格式的库文件。拷贝相应的库文件就可以了。比如如果需要x86平台的libtermcap.a,则重新编译个,拷到相应目录即可。最后,在gdb目录下会生成一个gdb

我用mipsel-linux-strip gdb 压缩后,就2M多。然后把这个文件拷贝到/usr/tools/bin/下覆盖mipsel-linux-gdb。

注意:GLIBC_2.3 is required by gdb

最后是进行 GDBSERVER 调试。在服务器端,要调试的代码目录下,新建文件.gdbinit ,这个文件在启动mipsel-linux-gdb的时候,会自动读取。写入以下内容:(假定我的程序是test)

symbol-file test
handle SIGPIPE nostop pass
handle SIG32 nostop noprint pass
handle SIG33 nostop noprint pass
handle SIG51 nostop noprint pass
target remote 192.168.73.236:2345

然后先在客户端启动 GDBSERVER。bin/gdbserver :192.168.73.253:2345 bin/test

然后在服务器端运行 mipsel-linux-gdb

 

------------------------绝对原创。如需转载,请附上本文地址。谢谢~

 

 

你可能感兴趣的:(虚拟机,redhat,服务器,search,平台,makefile)