交叉编译arm gdb

ARM 322浏览

交叉编译arm gdb

 By unanao <jianjiaosun@gmail.com>

arm-linuxgdb移植分为两种情况.

  • 交叉调试版。

    这种模式是需要编译一个arm-linux版本gdbserver
    (GDB
    stub模块).然后再编译一个X86版本交叉调试的gdb。为了与桌面版本身的gdb
    区别开来,一般改名为
    arm-linux-gdb
    。两者通过串口或者网络进行互联。

    这是比较正统的方法。它gdbserver可以通过arm-linux-gdb直接在host上单步调试target的应用程序。.并且可以与图形界面调试器配合进行图形界面调试。缺点就是target资源较少。因此单步调试的速度并不是太快。因此实用性不算太强。

  • 整个gdb移植成一个ARM的本地版

    在开发板上直接用gdb来调试。
    arm-linux的本地版一般只能做字符界面的。界面没有支持GUI的交叉调试版友好。而且单步调试速度也不算快。但是有几大大优点:

1)
定位程序退出所在函数.

2)
判断程序退出的原因

3)
通过条件断点分析异常情况时运行环境.

用本地版gdb运行程序时,当程序因段错误或其它原因退出程序时。可以通过gdb
bt(
backtrace)来查看最后运行的堆栈。来判断出错时是在哪一个函数里退出。这样会大大加快定位
错误的速度,这样有时需要几天的定位的错误,可能只需要几分钟即可定位,这在嵌入式开发里
有很强实际效用。

这里我们只介绍一下本地gdb的移植。

1下载最新的ncursegdb

  • ncurse: http://www.gnu.org/software/ncurses/

  • gdb: http://www.gnu.org/software/gdb/download/

为了清晰建立目录如下:ncurse放入libs目录,gdb
解压在项目目录下:

gdb (项目目录)

| --output

| |_arm-linux

|-- gdb-x.y

|

|--libs

|-- ncurse-x.y

x.y是版本号

1.1ncurse库的移植

解压
tar xvzf ncurses-x.y.tar.gz

cd ncurses-x.y

生成makefile

./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux --without-ada
--enable-termcap --with-shared

其中--enable-termcap比较关键gdb需要这个库

  --host=arm-linux
根据交叉编译工具连的名字而定, 如果交叉编译器的名字叫arm-neon-linux-gnueabi-gcc,
那么就是--host=
arm-neon-linux-gnueabi

编译
make

安装
make install

libncurses.so
库应该在output/arm-linux/lib

1.2gdb本身的移植。

解压
tar xvjf gdb-x.y.tar.bz2

cd gdb-x.y

生成Makefile

./configure --host=arm-linux --enable-shared --prefix=$PWD/output/arm
--without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext LDFLAGS="-L$PWD/../output/arm-linux/lib" CPPFLAGS="-I$PWD/../output/arm-linux/include"

脚本含义下:

  • --enable-shared
    动态编译

  • --host=arm-linux
    arm-linux-gcc编译(根据自己的编译器修改,去掉-gcc)

  • --prefix="$PWD/../output/arm-linux"
    安装目录

  • --without-x
    取消x windows
    支持

  • --disable-gdbtk
    取消gdbtk,应该也是图形界面相关的

  • --disable-tui
    取消tui
    界面

  • --without-included-regex
    关闭正则表达式库

  • --without-included-gettext
    去掉用于多语言处理的
    gettext

正则表达式/gettext,暂时不需要,先去掉

CPPFLAGS/LDFLAGS是确保能找到ARM版的ncurses

编译
make

安装
make install

最终的arm的程序gdb应该在output/arm-linux/bin下面,将其和libncurses.so拷贝到开发板上即可运行,象x86GDB一样运行即可

注意这个样编译能同时把ARMgdbserver
也同时编译出来并在安装目录看到.而且一般eabigcc编译器都自带了arm-linux-gdb.所以交叉版本的gdb移植很多时候可以省略.

刚刚编译出来的gdb尺寸相当大,10M,因此必须要用arm-linux-strip
gdb
来把尺寸减少.strip后大约2M