实验环境
- 开发主机:Ubuntu虚拟机x86_64
- 目标设备:imx8开发板Linux
准备工作
为了解决在gdb编译过程中出现的configure: error: GMP is missing or unusable
错误,我们在编译gdb之前交叉编译一下gmp。
当然,如果交叉编译工具链下有gmp
库和gmp.h
的话,可以忽略掉这里的准备工作。
下载源码gmp-6.2.1.tar.xz;
执行指令
tar xvf gmp-6.2.1.tar.xz
,解压然后进入文件夹cd gmp-6.2.1
;根据开发环境的配置方法,导出交叉编译工具链到当前环境变量,我们这里演示设备操作如下:
source /opt/fslc-framebuffer/2.4.4/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi
执行
arm-fslc-linux-gnueabi-gcc -v
查看开发主机类型和目标设备类型。比如我们这里的host和build是--build=x86_64-linux
和--host=x86_64-fslcsdk-linux
;COLLECT_GCC=arm-fslc-linux-gnueabi-gcc COLLECT_LTO_WRAPPER=/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/libexec/arm-fslc-linux-gnueabi/gcc/arm-fslc-linux-gnueabi/7.3.0/lto-wrapper Target: arm-fslc-linux-gnueabi Configured with: ../../../../../../work-shared/gcc-7.3.0-r0/gcc-7.3.0/configure --build=x86_64-linux --host=x86_64-fslcsdk-linux --target=arm-fslc-linux-gnueabi ......
执行如下指令,根据当前设备和目标设备进行配置;
./configure --host=arm-fslc-linux-gnueabi --build=x86_64-linux --prefix=/home/caeri/lzp/GIT/arm_gmp
- host指目标设备的类型;
- build指构建设备,也就是我们开发主机的类型;
- prefix指编译的安装目录;
配置完成后,效果如下;
config.status: linking mpn/arm/gmp-mparam.h to gmp-mparam.h config.status: executing libtool commands configure: summary of build options: Version: GNU MP 6.2.1 Host type: arm-fslc-linux-gnueabi ABI: 32 Install prefix: /home/caeri/lzp/GIT/arm_gmp Compiler: arm-fslc-linux-gnueabi-gcc -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi Static libraries: yes Shared libraries: yes
执行
make
进行编译,编译完成后,结果如下:root@ubuntu:/home/caeri/lzp/GIT/gmp/gmp-6.2.1# make
s.o rand/rands.o rand/randsd.o rand/randsdui.o rand/randbui.o rand/randmui.o libtool: link: arm-fslc-linux-gnueabi-ranlib .libs/libgmp.a libtool: link: rm -fr .libs/libgmp.lax libtool: link: ( cd ".libs" && rm -f "libgmp.la" && ln -s "../libgmp.la" "libgmp.la" ) make[2]: Leaving directory '/home/caeri/lzp/GIT/gmp/gmp-6.2.1' make[1]: Leaving directory '/home/caeri/lzp/GIT/gmp/gmp-6.2.1'
执行
make install
安装到我们指的的安装目录;root@ubuntu:/home/caeri/lzp/GIT/gmp/gmp-6.2.1# make install
最后,安装完成后,我们可以在指定的安装目录查看安装结果,这里包含了
gmp.h
和相关库;root@ubuntu:/home/caeri/lzp/GIT/arm_gmp# ls include lib share
到这里,gmp就编译完了,我们在编译gdb的时候依赖这里的文件。
交叉编译
在这里下载源码到Ubuntu,我们选择当前比较新的版本gdb-12.1.tar.gz;
执行
tar xvf gdb-12.1.tar.gz
解压到当前文件夹;根据开发环境的配置方法,导出交叉编译工具链到当前环境变量,我们这里演示设备操作如下:
source /opt/fslc-framebuffer/2.4.4/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi
执行
arm-fslc-linux-gnueabi-gcc -v
查看开发主机类型和目标设备类型,以在配置gdb编译过程的时候使用这些参数,比如我们这里的host和build是--build=x86_64-linux
和--host=x86_64-fslcsdk-linux
;加载配置,这里我们引用了准备工作中编译的gmp库的路径,大家编译的时候要替换成自己的环境;
./configure --prefix=/home/caeri/lzp/GIT/arm-gdb --host=arm-fslc-linux-gnueabi --build=x86_64-linux CFLAGS="-I/home/caeri/lzp/GIT/arm_gmp/include -L/home/caeri/lzp/GIT/arm_gmp/lib" CXXFLAGS="-I/home/caeri/lzp/GIT/arm_gmp/include -L/home/caeri/lzp/GIT/arm_gmp/lib"
配置加载完成后,执行
make
开始编译,这个编译过程可能会耗费5-10分钟~~(设备太慢)~~,很遗憾太激动了没有截图;root@ubuntu:/home/caeri/lzp/DC/gdb/gdb-12.1# make
这里如果出现了
configure: error: GMP is missing or unusable
这个错误,请按照准备工作中,老老实实的编译一遍,再仔细检查上一步configure
路径是否配置正确;编译完成后,如果没有报错,进入
gdbserver
文件夹:root@ubuntu:/home/caeri/lzp/DC/gdb/gdb-12.1# cd gdbserver
这次,我把
gdbserver
的安装目录放在了/home/caeri/lzp/GIT/arm-gdbserver
,配置如下:./configure --prefix=/home/caeri/lzp/GIT/arm-gdbserver --host=arm-fslc-linux-gnueabi --build=x86_64-linux
然后在目录
/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver
下,依次执行make
、make install
,编译安装;root@ubuntu:/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver# make GEN version-generated.cc CXX version.o CXXLD gdbserver CXXLD gdbreplay root@ubuntu:/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver# make install make[1]: Entering directory '/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver' n=`echo gdbserver | sed 's,x,x,'`; \ if [ x$n = x ]; then n=gdbserver; else true; fi; \ if [ x"" != x ]; then \ /bin/bash ./../mkinstalldirs /home/caeri/lzp/GIT/arm-gdbserver/lib; \ /usr/bin/install -c libinproctrace.so /home/caeri/lzp/GIT/arm-gdbserver/lib/libinproctrace.so; \ fi; \ /bin/bash ./../mkinstalldirs /home/caeri/lzp/GIT/arm-gdbserver/bin; \ /usr/bin/install -c gdbserver /home/caeri/lzp/GIT/arm-gdbserver/bin/$n mkdir -p -- /home/caeri/lzp/GIT/arm-gdbserver/bin make[1]: Leaving directory '/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver'
最后,如果操作成功,我们可以在
/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver
下看到我们编译出的gdbserver应用,可以在开发板上运行。./gdbserver Usage: gdbserver [OPTIONS] COMM PROG [ARGS ...] gdbserver [OPTIONS] --attach COMM PID gdbserver [OPTIONS] --multi COMM COMM may either be a tty device (for serial debugging),
至此,交叉编译工作完成。