Linux工具之gdb 移植到arm-linux系统

linux主机:ubuntu-18.04
交叉编译器:arm-linux
开发板kernel:Linux 5.4.0-150-generic x86_64
开发板:100ASK_STM32MP157_PRO开发板
arm-linux的gdb移植分为两种情况,一种是交叉调试,一种是本地调试。
交叉调试模式:需要编译一个arm-linux版本gdbserver (GDB的stub模块),然后再编译一个X86版本交叉调试的gdb,为了与桌面版本身的gdb 区别开来,一般改名为 arm-linux-gdb。两者通过串口或者网络进行互联。
本地调试模式:这种模式把整个gdb移植成一个arm的本地版,直接在开发板上用gdb来调试。
两种调试模式的具体差异查看博文:arm-linux的gdb移植,交叉调试模式编译:嵌入式arm linux环境中gdb+gdbserver调试
本博文介绍本地调试模式
文件目录结构
按照移植规范,ncurse放入libs目录,gdb 解压在项目目录下
/home/test/gdb (项目目录)
|
|--output
|      |-- arm-linux
|  
|-- gdb-7.6.1
|
|-- libs
    |-- ncurses-5.9.tar.gz

移植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-linux --prefix=$PWD/output/arm-linux  --enable-termcap --with-shared --without-ada

–host表示交叉编译器的前缀,根据交叉编译器的不同需要进行更改
–prefix表示的是目标目录,即编译完成后生成的文件的位置
–enable-termcap比较关键,gdb需要这个库,
-with-shared表示动态编译
编译
make
报错:
In file included from ../ncurses/curses.priv.h:283,
                 from ../ncurses/lib_gen.c:19:
_22148.c:835:15: error: expected ‘)’ before ‘int’
../include/curses.h:1594:56: note: in definition of macro ‘mouse_trafo’
 #define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)
                                                        ^
Makefile:794: recipe for target '../obj_s/lib_gen.o' failed
make[1]: *** [../obj_s/lib_gen.o] Error 1
make[1]: Leaving directory '/home/test/gdb/ncurses-5.9/ncurses'
Makefile:109: recipe for target 'all' failed
make: *** [all] Error 2

解决方法:
进入ncurses-5.9/include文件夹,修改 curses.tail 文件:
将 extern NCURSES_EXPORT(bool)    mouse_trafo (int*, int*, bool);              /* generated */ 
改为 extern NCURSES_EXPORT(bool)    mouse_trafo (int*, int*, bool);
也就是去掉注释 /* generated */

安装
make install
以上操作成功后,会在libncurses.so.5 库应该在/home/hxy/gdb/output/arm-linux/lib可执行文件,libncurses.so.5就是我们要移植到arm板上的文件。
cp libncurses.so.5 /home/book/arm_rootfs/
前提是使用nfs,或者使用其他工具移植到开发板中

移植gdb
下载gdb源代码:http://ftp.gnu.org/gnu/gdb/
下载版本: gdb-7.6.1.tar.gz

进入下载目录解压
tar -xvf gdb-7.6.1.tar.gz
进入解压目录
cd gdb-7.6.1
生成Makefile
./configure --host=arm-linux CC=arm-linux-gcc --enable-shared --prefix=$PWD/output/arm-linux --disable-werror --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext LDFLAGS="-L$PWD/../output/arm-linux/lib" CPPFLASS="-I$PWD/../output/arm-linux/include"
–enable-shared 动态编译
CC 是交叉编译器的绝对路径,为了避免找不到交叉编译器的错误
–without-x 取消x windows 支持
–disable-gdbtk 取消gdbtk,应该也是图形界面相关的
–disable-tui 取消tui 界面
–disable-werror 屏蔽werror报警
–without-included-regex 关闭正则表达式库
–without-included-gettext 去掉用于多语言处理的 gettext库。正则表达式/gettext暂时不需要
–host=arm-linux 用arm-linux编译
–prefix=“$PWD/output/arm-linux” 安装目录
"LDFLAGS=XXX"指定的是前面交叉编译完成的ncurse的lib目录的路径
"CPPFLAGS=XXX"指定的是前面交叉编译完成的ncurse的include目录的路径;
编译
make
安装
make install
最终的可执行程序gdb应该在/home/test/gdb/output/arm-linux/bin下面
刚刚编译出来的gdb空间相当大,因此必须要用arm-linux-strip 来把空间减少
arm-linux-strip gdb
移植到arm板
将生成的动态库和可执行文件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
调试测试
在Ubuntu环境下编写一个简单的C程序,命名为test.c,在Ubuntu环境下打开命令行进行交叉编译
arm-linux-gcc -g test.c -o test
将生成的可执行文件test拷贝到arm板上,给予可执行权限。然后进行gdb调试,
gdb test

猜你喜欢

转载自blog.csdn.net/u010258235/article/details/133742071
今日推荐