交叉编译GDB

#文中arm-926ejs-linux-gnueabi-gcc为笔者使用crosstool-ng制作的工具链
#请注意交叉工具链的搜索路径

【一】下载源码包

gdb官网下载,这里下载的是gdb-7.8.2.tar.xz,放在~/Downloads下。
http://www.gnu.org/software/gdb/

依赖库ncurses,这里下载的是ncurses-5.9.tar.gz,放在~/Downloads下。
https://www.gnu.org/software/ncurses/

依赖库termcap,这里下载的是termcap-1.3.1.tar.gz,放在~/Downloads下。
http://ftp.gnu.org/gnu/termcap/

【二】宿主机准备我的PC的操作系统为ubuntu 14.04 x64,非debian系的请自行解决。
# 1.运行库和工具准备
sudo apt-get install bison flex expect-dev build-essential m4 autoconf automake texi2html
# 2.创建安装目录,并增加写入权限,方便安装。所有交叉编译的库和软件都会被安装在这里
mkdir /opt/arm_root
sudo chmod a+w /opt/arm_root
# 3.创建编译目录
mkdir ~/buildspace

【三】交叉编译在ARM上运行的gdb和gdbserver
#1.termcap

cd ~buildspace
tar xf ~/Downloads/termcap-1.3.1.tar.gz
cd termcap-1.3.1
CC=arm-926ejs-linux-gnueabi-gcc ./configure --prefix=/opt/arm_root
make
make install

make install的时候报错/usr/bin/install: cannot remove ‘/usr/include/termcap.h’: Permission denied 不用理它……都指定了prefix,还往默认目录写头文件
# 2.ncurses

cd ~/buildspace
tar xf ~/Downloads/ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=/opt/arm_root --host=arm-926ejs-linux-gnueabi --with-shared  #--host=交叉编译器前缀。
make 
make install

# 3.gdb

cd ~/buildspace
tar xf ~/Downloads/gdb-7.8.2.tar.xz
mv gdb-7.8.2 gdb-7.8.2_arm cd gdb
-7.8.2_arm ./configure --host=arm-926ejs-linux-gnueabi --target=arm-926ejs-linux-gnueabi --prefix=/opt/arm_root --enable-static LDFLAGS="-L/opt/arm_root/lib" CFLAGS="-I/opt/arm_root/include" #指定库和头文件的路径 make
make
install

完成后在/opt/arm_root/bin下就有在ARM上运行的gdb和gdbserver了。

【四】编译pc上运行,与gdbserver相同版本的gdb
实际上不同版本也能用,只是可能出现兼容性问题
重新解压一份gdb源码,用pc的gcc编译,指定target为我们的交叉工具链前缀即可

cd ~/buildspace
tar xf ~/Downloads/gdb-7.8.2.tar.xzmv gdb-7.8.2 gdb-7.8.2_arm
cd gdb-7.8.2
./configure --target=arm-926ejs-linux-gnueabi --enable-static  #使用操作系统的库
make
cp gdb/gdb ~/arm-none-linux-gnueabi-gdb

编译完成后,就能在~/buildspace/gdb-7.8.2/gdb下找到生成的gdb文件,拷贝出来重命名即可。

【五】配置嵌入式设备
#1.拷贝文件
#动态库
cp /opt/arm_root/lib/*.so* /home/rootfs/lib
#可执行文件
cd /opt/arm_root/bin
cp gdb gdbserver gcore /home/rootfs/usr/local/bin

#去除可执行文件的符号信息,减小体积
cd /home/rootfs/usr/local/bin/
arm-926ejs-linux-gnueabi-strip gdb
arm-926ejs-linux-gnueabi-strip gdbserver

#拷贝终端类型数据库
mkdir /home/rootfs/usr/share -p
cp /opt/arm_root/share/terminfo /home/rootfs/usr/share

#2.配置环境变量
修改/etc/profile,确保有以下两行

export TERM=vt102
export TERMINFO=/usr/share/terminfo

#3.测试
更新文件系统后,启动gdb,输入ctrl+x a(就是先按一次CTRL+X,松开再按一下A)切换到TUI模式。通过串口(minicom)运行就是如下这种样子,行号左侧B+表示有断点,>为当前行且会被高亮

   lqqvin.cqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
   x25      //                                                                 x
   x26      //}                                                                x
   x27      #define VIDIOCSPREVIEW                          _IOR('v',43, int)  x
   x28      int main()                                                         x
   x29      {                                                                  x
B+>x30              int fd = open("/dev/video0", O_RDWR);                      x
   x31              if(fd == 0)                                                x
   x32              {                                                          x
   x33                      printf("open failed\n");                           x
   x34                      return -1;                                         x
   x35              }                                                          x
   x36              struct video_capability cap;                               x
   x37              int ret = ioctl(fd,VIDIOCGCAP,&cap);                       x
   mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
native process 419 In: main                               Line: 30   PC: 0x85c4 
(gdb) b main
Breakpoint 1 at 0x85c4: file vin.c, line 30.
(gdb) r
Starting program: /mnt/nfs/626_app/vin 

Breakpoint 1, main () at vin.c:30
(gdb)  

需要注意,程序本身的输出可能破坏TUI的显示

 

以下是在用omapl138时编写的脚本

################################################################
PATH_CROSS=/opt/arm-linux-gcc/omap_4.3.3/bin;
echo $PATH > /tmp/path_;
touch /tmp/path;
if [ -z `grep $PATH_CROSS /tmp/path` ];
then
    echo $PATH:$PATH_CROSS > /tmp/path;
fi;
PATH=`cat /tmp/path`;
rm /tmp/path;
rm /tmp/path_;

################################################################
TOP=`pwd`;
TARGET=arm-none-linux-gnueabi;
ARMROOT=/opt/omapl138_root

################################################################
TERMCAP=termcap-1.3.1
echo -n "building termcap ..."
if true;
then
    cd $TOP;
    if [ -d $TERMCAP ]; then rm -rf $TERMCAP; fi;
    tar xf $TERMCAP.tar.*;
    cd $TERMCAP;
    CC=$TARGET-gcc ./configure --prefix=$ARMROOT;
    make -j4;
    make install;
fi > $TOP/termcap.log 2>&1;
echo "done"
#############################################################
NCURSES=ncurses-5.9
echo -n "building ncurses ..."
if true;
then
    cd $TOP;
    if [ -d $NCURSES ]; then rm -rf $NCURSES; fi;
    tar xf $NCURSES.tar.*;
    cd $NCURSES;
    ./configure --prefix=$ARMROOT --host=$TARGET --with-shared
    make -j4
    make install
fi > $TOP/ncurses.log 2>&1;
echo "done"
###############################################################
GDB=gdb-7.9.1
echo "building gdb ..."
echo -ne "\t decompressing ..."
cd $TOP;
if [ -d gdb_arm ]; then rm -rf gdb_arm; fi;
if [ -d gdb_pc ]; then rm -rf gdb_pc; fi;
tar xf $GDB.tar.*;
cp $GDB -r gdb_arm;
mv $GDB gdb_pc;
echo "done"

echo -ne "\t building gdb running on arm ..."
if true;
then
    cd $TOP/gdb_arm;
    ./configure --host=$TARGET --target=$TARGET --prefix=$ARMROOT --enable-static LDFLAGS="-L$ARMROOT/lib" CFLAGS="-I$ARMROOT/include"
    make -j4
    make install
fi > $TOP/gdb_arm.log 2>&1
echo "done"

echo -ne "\t building "$TARGET-gdb" running on pc ..."
if true;
then
    cd $TOP/gdb_pc;
    ./configure --target=$TARGET --enable-static
    make -j4
    cp gdb/gdb $TOP/$TARGET-gdb;
fi > $TOP/gdb_pc.log 2>&1;
echo "done"
echo -e "\t done"
###############################################################

 

posted on 2015-03-03 15:17  jacob1934  阅读(3455)  评论(0编辑  收藏  举报

导航