开发环境
- PC系统:VMware虚拟机 Ubuntu16.04
- arm板:海思HI3536开发板
- 交叉编译器:
arm-hisiv400-linux-gcc
目标
把本地调试版的gdb移植到arm板上增加板子的调试功能
gdb的移植分为两种:
1. 远程调试
这一种模式是需要交叉编译gdb和gdbserver,将交叉编译好的gdbserver移植到arm板上,再通过串口或者网线将PC与arm板连接起来,实现远程调试。
2. 本地调试
这种模式把整个gdb移植成一个arm的本地版,直接在开发板上用gdb来调试。本博客介绍的是这种本地调试模式。
参考链接
http://blog.chinaunix.net/uid-23381466-id-309369.html
https://blog.youkuaiyun.com/ZefinNg/article/details/96479993
1.安装交叉编译器
这里不同环境交叉编译器也不相同,不做详细介绍,可参考其他博客。
但是一定要注意,安装好交叉编译器是后续步骤的基础。移植的思路是:下载gdb源码——使用交叉编译器编译gdb生成可执行程序——将可执行程序移植到arm板上。因此,如果交叉编译器没有安装成功,是无法生成可以在arm板上可运行的可执行程序的。
本贴中使用的是海思交叉编译器 arm-hisiv400-linux-gcc
,请先检查交叉编译器是否安装成功。在Ubuntu中打开终端,输入
arm-hisiv400-linux-gcc -v
若正常显示交叉编译器的版本,说明已安装成功,如下图所示:
另外,还要检查交叉编译器是否已经添加至环境变量
vi /etc/profile
如下图所示。
总而言之,第一步的主要任务是确保交叉编译器已安装成功,详细信息请参阅对应交叉编译器的其他博客。海思交叉编译器的安装可以参考下面这篇博客:
https://blog.youkuaiyun.com/qq_29350001/article/details/52440188
2.移植ncurses库
本地gdb运行需要ncurses库的支持,因此先做ncurses库的移植。
下载地址:http://ftp.gnu.org/gnu/ncurses/
本贴下载的是 ncurses-5.9.tar.gz
进入下载目录,输入命令进行解压
tar -zxvf ncurses-5.9.tar.gz
进入解压后的目录
cd ./ncurses-5.9
配置Makfile
./configure --host=arm-hisiv400-linux --prefix=$PWD/output/arm --enable-termcap --with-shared
其中,--host
表示交叉编译器的前缀,根据交叉编译器的不同需要进行更改,--prefix
表示的是目标目录,即编译完成后生成的文件的位置。后两个参数具体意义暂不清楚,记得也要加上。
make,仍然是在解压的目录里
make
make install
make install
这两步有时会出错,请注意观察命令行反馈的错误信息,善用搜索。博主本人在这一步遇到的主要问题是明明交叉编译器已经安装好了,make也成功了,但make install一直出错,最终的解决方案是换了一个版本的ncurses库,也就是换到5.9版本后编译成功了。
以上操作成功后,会在 ./ncurses-5.9/output/arm/lib
目录下看到libncurses.so.5
可执行文件,libncurses.so.5
就是我们要移植到arm板上的文件。
3.移植gdb
下载gdb源代码:http://ftp.gnu.org/gnu/gdb/
本贴下载版本的是 gdb-7.6.1.tar.gz
请注意,博主之前下载过6.8a和7.0a的版本,但编译时都会出错,查询很多博客说是gdb源码的问题,所以建议大家直接选择7.6.1版本的。
进入下载目录解压
tar -xvf gdb-7.6.1.tar.gz
进入解压目录
cd gdb-7.6.1
配置Makefile文件
./configure --host=arm-hisiv400-linux CC=/opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-gcc --enable-shared --prefix=$PWD/output/arm --disable-werror --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext LDFLAGS="-L/home/xin/Downloads/ncurses-5.9/output/arm/lib" CPPFLAGS="-I/home/xin/Downloads/ncurses-5.9/output/arm/include"
这里解释下部分参数
--host
依然是交叉编译器前缀
CC
是交叉编译器的绝对路径,为了避免部分博客所说的找不到交叉编译器的错误
--prefix
依然是编译生成的目标文件的位置
LDFLAGS
是第2步中的ncurses库编译后生成的lib文件夹的绝对路径
CPPFLASS
是是第2步中的ncurses库编译后生成的include文件夹的绝对路径
其余参数也请不要忘记
make
make
make install
make install
与安装ncurses库类似,这两部编译也经常容易出错,请详细检查之前的操作是否正确,观察命令行的错误信息,善用搜索引擎,多次尝试。
以上步骤成功后会在/gdb-7.6.1/output/arm/bin
文件夹中看到gdb
可执行文件,gdb
就是我们要移植到arm板上的可执行文件。但是这里的gdb
文件提及有些大,博主这里有19MB,使用一下命令对gdb
进行压缩
arm-hisiv400-linux-strip gdb
其中前面的命令是对应的交叉编译器,执行该命令后,gdb
的体积变为了3MB,效果十分明显。
4.移植到arm板
将第2步、第3步中生成的可执行文件libncurses.so.5
、gdb
拷贝到arm板上,给予可执行权限。
chmod +x libncurses.so.5 gdb
并将libncurses.so.5
放在arm板的/usr/lib
目录下
cp libncurses.so.5 /usr/lib
并将gdb
放在arm板的bin
目录下
cp gdb /bin
5.调试测试
在Ubuntu环境下编写一个简单的C程序,命名为gdb_test.c
,在Ubuntu环境下打开命令行进行交叉编译
arm-hisiv400-linux-gcc -g gdb_test.c -o gdb_test
其中 -g
就是gdb调试的意思
将生成的可执行文件gdb_test
拷贝到arm板上,给予可执行权限。
chmod +x gdb_test
进行gdb调试
gdb gdb_test
即可进入gdb调试环境,进行调试了。
成功图如下所示:
总结
最关键的步骤就是利用交叉编译器编译ncurses库和gdb源码生成可执行文件,后续将可执行文件拷贝到arm板上即可。其中交叉编译最容易出问题,博主在尝试的时候绝大部分时间也是花在交叉编译ncurses库和gdb源代码上面了。如果交叉编译出从,我的建议是
- 观察命令行返回的错误,利用搜索引擎搜索该错误,查找经验贴
- 检查之前步骤是否有错误,如交叉编译器是否安装成功、Makefile是否配置正确
- 换一个版本的ncurses库和gdb源代码
- 多次尝试,不要怕出错,太乱了就删除掉安装目录重新再来。
第一次写博客,以上也是我参考了许多博客、自己不断尝试才取得的成功,想把自己的经验记录下来以便日后查看,也希望对相关人员有所帮助。如有错误,欢迎指正,如有问题,欢迎交流~