交叉编译GDB工具
全志T113是一款面向嵌入式应用的处理器,属于全志科技(Allwinner)T系列产品线。该芯片采用双核Cortex-A7 CPU架构,主频可达1.2GHz,集成ARM Mali400 MP2 GPU,支持1080p视频编解码,适用于工业控制、智能家居、物联网等低功耗场景。
做开发工作离不开调试工具,我不习惯用gdbserver,习惯直接在板子上运行gdb,这里就需要交叉编译一个板子上运行的gdb。
下载GDB源码
从GNU官网下载GDB源码包,推荐使用稳定版本以确保兼容性,我这边用的是10.2版本。可以通过以下命令下载:
wget https://ftp.gnu.org/gnu/gdb/gdb-10.2.tar.gz
tar xzf gdb-10.2.tar.gz
cd gdb-10.2
../gdb-7.9/configure CC=arm-htnice-linux-gnueabihf-gcc --enable-static CFLAGS="-g -O2 -I /home/users/xxx/code/gdb/termcap" LDFLAGS="-L/home/users/wuwei/xxx/gdb/termcap" --prefix=`pwd`/install --target=arm-htnice-linux-gnueabihf --host=arm-htnice-linux-gnueabihf --program-prefix=arm-htnice-linux-gnueabihf
make
由于gdb会依赖termcap库,上面我制定了termcap的路径。
编译错误解决
编译过程中,报如下错误:
In file included from ../../gdb-10.2/gdbserver/gdb_proc_service.h:22,
from ../../gdb-10.2/gdbserver/linux-low.h:27,
from ../../gdb-10.2/gdbserver/linux-aarch32-low.cc:21:
../../gdb-10.2/gdbserver/../gdbsupport/gdb_proc_service.h:179:12: 错误: ‘ps_get_thread_area’ was not declared in this scope; did you mean ‘target_thread_name’?
179 | PS_EXPORT (ps_get_thread_area);
| ^~~~~~~~~~~~~~~~~~
../../gdb-10.2/gdbserver/../gdbsupport/gdb_proc_service.h:177:51: 附注: in definition of macro ‘PS_EXPORT’
177 | __attribute__((visibility ("default"))) typeof (SYM) SYM
| ^~~
../../gdb-10.2/gdbserver/../gdbsupport/gdb_proc_service.h:182:12: 错误: ‘ps_lgetfpregs’ was not declared in this scope; did you mean ‘ps_lgetregs’?
182 | PS_EXPORT (ps_lgetfpregs);
| ^~~~~~~~~~~~~
../../gdb-10.2/gdbserver/../gdbsupport/gdb_proc_service.h:177:51: 附注: in definition of macro ‘PS_EXPORT’
177 | __attribute__((visibility ("default"))) typeof (SYM) SYM
| ^~~
../../gdb-10.2/gdbserver/../gdbsupport/gdb_proc_service.h:184:12: 错误: ‘ps_lsetfpregs’ was not declared in this scope; did you mean ‘ps_lgetfpregs’?
184 | PS_EXPORT (ps_lsetfpregs);
| ^~~~~~~~~~~~~
../../gdb-10.2/gdbserver/../gdbsupport/gdb_proc_service.h:177:51: 附注: in definition of macro ‘PS_EXPORT’
177 | __attribute__((visibility ("default"))) typeof (SYM) SYM
| ^~~
make[2]: *** [Makefile:542:linux-aarch32-low.o] 错误 1
make[2]: 离开目录“/home/users/xxxx/code/gdb/gdbserver”
make[1]: *** [Makefile:10001:all-gdbserver] 错误 2
make[1]: 离开目录“/home/users/xxxx/code/gdb/”```
编译完成后,GDB可执行文件将生成在指定的安装路径下。
解决方法:
在Ygdb-10.2gdbsupportgdb_proc_service.h中增加如下代码:
// 添加缺失的声明
EXTERN_C_PUSH
extern ps_err_e ps_get_thread_area(struct ps_prochandle*, lwpid_t, int, psaddr_t*);
extern ps_err_e ps_lgetfpregs(struct ps_prochandle*, lwpid_t, prfpregset_t*);
extern ps_err_e ps_lsetfpregs(struct ps_prochandle*, lwpid_t, const prfpregset_t*);
EXTERN_C_POP
#endif
验证交叉编译结果
将生成的GDB二进制文件拷贝到全志T113开发板上运行,检查是否正常工作:
./gdb test
r启动程序后输入“r”,test程序能够正常运行,然后用"b"设置断点,能够停下来,说明gdb可以正常使用。
1521
