交叉编译GDB
1.下载GDB源码
在GDB官网寻找:http://www.gnu.org/software/gdb/download/
版本结合你安装在开发板上的gdbserver来定,我的板子上有openwrt系统,可以直接安装gdbserver,gdbserver –version可以查看其版本,我这里是7.8的。
2.解压并创建安装目录
tar zxvf gdb-7.8.tar.gz
cd gdb-7.8/
mkdir gdb7.8_mipsel
我的板子是mips架构的。
3.编译安装
GDB源码编译安装也属于configure系列的,所以结合之前编译PHP源码、swoole源码的经验,加上最近学习了一部分shell脚本,我们可以将编译安装命令写成一个简单的shell脚本(python也可以,顺便熟悉一下python,~_~),编译安装成功后在gdb7.8_mipsel目录如下所示:
以下是编译安装脚本,以供参考:
#!/bin/bash
# Copyright (C) 2018-2019 ZY
mkdir gdb7.8_mipsel
echo "begin to configure..."
CC=mipsel-openwrt-linux-uclibc-gcc AR=mipsel-openwrt-linux-uclibc-ar LD=mipsel-openwrt-linux-uclibc-ld RANLIB=mipsel-openwrt-linux-uclibc-ranlib STRIP=mipsel-openwrt-linux-uclibc-strip ./configure --host=mipsel-openwrt-linux-uclibc --prefix=/home/ubuntu/gdb-7.8/gdb7.8_mipsel/
if [ -e "Makefile" ]; then
echo "=============================="
echo "configure ok,begin to make..."
echo "=============================="
sleep 1
make
else
echo "=============================="
echo "configure failed"
echo "=============================="
sleep 1
fi
if [ -e "./gdb/gdb" ]; then
echo "=============================="
echo "make ok,begin to make install..."
echo "=============================="
sleep 1
make install
else
echo "=============================="
echo "make install failed"
echo "=============================="
sleep 1
fi
4.可能遇到的错误解决方法
make编译时遇到:
configure: error: no termcap library found
很明显,缺少termcap库,结合之前交叉编译其它源码的经验,没有该库则交叉编译该库,然后将相应的头文件和库文件拷贝到交叉编译工具链相关的目录下即可。
(1).下载termcap
http://ftp.gnu.org/gnu/termcap/?C=D;O=A
我将其放在gdb的同级目录下,然后:
tar zxvf termcap-1.3.tar.gz
cd termcap-1.3/
(2).将上面的编译安装gdb的脚本改一下
# Copyright (C) 2018-2019 ZY
mkdir termcap_mipsel
echo "begin to configure..."
CC=mipsel-openwrt-linux-uclibc-gcc AR=mipsel-openwrt-linux-uclibc-ar LD=mipsel-openwrt-linux-uclibc-ld RANLIB=mipsel-openwrt-linux-uclibc-ranlib STRIP=mipsel-openwrt-linux-uclibc-strip ./configure --host=mipsel-openwrt-linux-uclibc --prefix=/home/ubuntu/termcap-1.3/termcap_mipsel/
if [ -e "Makefile" ]; then
echo "=============================="
echo "configure ok,begin to make..."
echo "=============================="
sleep 1
make
else
echo "=============================="
echo "configure failed"
echo "=============================="
sleep 1
fi
if [ -e "termcap.o" ]; then
echo "=============================="
echo "make ok,begin to make install..."
echo "=============================="
sleep 1
make install
else
echo "=============================="
echo "make install failed"
echo "=============================="
sleep 1
fi
(3).对于最后的权限不够无法删除PC机上termcap.h文件时
不需理会,我们不需要将termcap安装到我们的PC机上:
然后在网上查到这样一个命令:
mipsel-openwrt-linux-gcc -print-file-name=libc.a找到我们要将头文件和库文件拷贝的位置,比如我这里:
然后将相关的头文件和库文件拷贝到对应的位置即可使gdb源码make成功,比如我这里:
cp libtermcap.a /opt/OpenWrt-Toolchain-ramips-mt7628_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/lib/gcc/mipsel-openwrt-linux-uclibc/4.8.3/
cp termcap.h /opt/OpenWrt-Toolchain-ramips-mt7628_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/include/
当然,这些命令都可以结合脚本放在脚本文件中执行,我这里就不再展示了。
5. 可能需要交叉编译GDBSERVER,将其安装在开发板上
我的开发板上有openwrt系统,可以直接:
opkg update
opkg install gdbserver
有的板子可能无法直接安装,或者不喜欢、不能用这个版本的gdbserver的,编译gdb源码移植gdbserver即可,如果编译出来的gdbserver太大则需要精简,关于如何精简,这里不再多说,我们本次总结的重点不在这里。