#文中arm-926ejs-linux-gnueabi-gcc为笔者使用crosstool-ng制做的工具链
#请注意交叉工具链的搜索路径html
【一】下载源码包linux
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/ubuntu
依赖库termcap,这里下载的是termcap-1.3.1.tar.gz,放在~/Downloads下。
http://ftp.gnu.org/gnu/termcap/app
【二】宿主机准备个人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 ~/buildspaceide
【三】交叉编译在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.gdbflex
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了。ui
【四】编译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" ###############################################################