GDB的移植和交叉编译

某项目需要离线GBD工具支持调试。过程中遇到不少坑。先记录下来。

1、 下载gdb:

下载地址为:
http://ftp.gnu.org/gnu/gdb/
按照一般的想法,最新版本越好,因此下载8.2这个版本。当然,凡事无绝对。我们以gdb-8.2.tar.gz 这个文件为例。

2、 解压缩:

tar -xzvf gdb-8.2.tar.gz

3、 进入该目录

cd gdb-8.2/

4、 配置

./configure --target=arm-linux --program-prefix=arm-linux- --prefix=/home/roth-qt/gdb/arm-gdb

注:–target=arm-linux意思是说目标平台是运行于ARM体系结构的linux内核;–program-prefix=arm-linux-是指生成的可执行文件的前缀,比如arm-linux-gdb,–prefix是指生成的可执行文件安装在哪个目录

5、 编译、安装

make
make install
make的过程中遇到了错误

*** A compiler with support for C++11 language features is required.

查了一下,是因为编译工具版本不够导致,需要升级到gcc-4.9。
Gcc版本下载地址http://ftp.gnu.org/gnu/gcc/
Arm-linux-gcc 版本下载地址https://www.linaro.org/downloads/
在下载了gcc4-9-3之后,进行配置时发现有对其他库的依赖
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
下载GMP、MPFR和MPC
官网下载GMP:https://gmplib.org/
官网下载MPFR:http://www.mpfr.org/mpfr-current/#download
Gnu下载MPC:http://ftp.gnu.org/gnu/mpc/
需要按照顺序安装GMP、MPFR和MPC
安装GMP

./configure --prefix=/usr/local/gmp 
make
sudo make install

安装MPFR

./configure –prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp
make
sudo make install

安装MPC

./configure --prefix=/usr/local/mpc/ --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr

在安装MPC的时候会出现mul.c:175:1: error: conflicting types for ‘mpfr_fmma’报错
解决办法:
将mul.c内的所有mpfr_fmma函数改名为mpfr_fmma_mul,一共有三处地方。
之后再执行gcc配置时,需要带上对应的参数

sudo ./configure --prefix=/opt/gcc-4.9.3/ -enable-threads=posix -disable-checking -disable-multilib -enable-languages=c,c++ --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --with-mpc=/usr/local/mpc

此时执行如果还是报三个需要的库文件版本问题时,检查gcc目录下的config.log文件
/usr/local/mpc/lib/libmpc.so: undefined reference to mpfr_add_one_ulp' /usr/local/mpc/lib/libmpc.so: undefined reference tompfr_sub_one_ulp’
collect2: error: ld returned 1 exit status
如果出现上面的错误,需要修改mpfr下的mpfr.h,新增如下内容:

#define mpfr_add_one_ulp(x,r)  (mpfr_sgn (x) > 0 ? mpfr_nextabove (x) : mpfr_nextbelow (x)) #define mpfr_sub_one_ulp(x,r)  (mpfr_sgn (x) > 0 ? mpfr_nextbelow (x) : mpfr_nextabove (x))

在实际安装过程中,发现这三个库匹配并不是可以随意组合的,可能还会有报错,从下面的文章中找到了方案
https://blog.csdn.net/wuyupei1213434654/article/details/8847932
在编译GCC的过程中可能出现“configure: error: cannot compute suffix of object files: cannot compile”的错误,解决方法是将三个支持软件的库加入变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-0.8.1/lib:/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-2.4.2/lib

6、 进入安装目录/usr/local/arm-gdb/bin

ls检查目录下文件发现arm-linux-gdb有64M
roth-qt@rothqt:/usr/local/arm-gdb/bin$ ls -lh
总用量 70M
-rwxr-xr-x 1 root root 64M 11月 8 10:35 arm-linux-gdb
-rwxr-xr-x 1 root root 3.2K 11月 8 10:35 arm-linux-gdb-add-index
-rwxr-xr-x 1 root root 5.8M 11月 8 10:35 arm-linux-run
使用strip命令对文件瘦身
strip arm-linux-gdb -o arm-linux-gdb-stripped
瘦身后文件大小为6M左右
roth-qt@rothqt:/usr/local/arm-gdb/bin$ ls -lh arm-linux-gdb-stripped
-rwxr-xr-x 1 root root 5.5M 11月 8 10:37 arm-linux-gdb-stripped
这个瘦身后的文件就是我们以后远程调试时在主机上运行的交叉调试器了:在主机上执行,调试的却是另一种体系结构的代码。但是,光有主机的调试器还不够。还需要在目标板上运行一个叫gdbserver的东东。
7、 进入gdb解码目录下的gdbserver
roth-qt@rothqt:~/gdb/gdb-8.2/gdb$ cd gdbserver/
PS:对于configure: error: no termcap library found问题,找不到适配的arm-linux-gcc版本,只能下载gdb7.4.1(7.3.1备选)的版本尝试,该版本是在gcc4.9之前。搭配现有的arm-linux-gcc4.6.2版本使用。
安装gdb之前,先安装termcap库。解压termcap-1.3.1之后进入软件目录下进行配置

./configure --target=arm-none-linux-gnueabi --prefix=/opt/termcap

但是此时并没有指定编译链,如果直接编译会使用默认的gcc去做
在Makefile中修改CC和AR选项
CC = arm-none-linux-gnueabi-gcc
AR = arm-none-linux-gnueabi-ar
修改后make&make install
将编译好了的termcap目录下的库和头文件复制到编译工具的对应目录下
4.6.2的编译工具的对应目录为/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/lib(include)
此时再去gdb目录下执行配置,编译和安装

./configure \
CC=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-gcc  --libdir=--target=arm-linux --program-prefix=arm-linux- --prefix=/home/roth-qt/gdb/arm-gdb/ --host=arm-linux
make -j4
make install

将对应的安装目录拷贝到开发板上,加上环境变量,就可以使用gdb工具了。

猜你喜欢

转载自blog.csdn.net/weixin_40983190/article/details/84940877