静态编译GDB的方法

概述   

   GDB是Linux系统上最常用的调试工具,特别在系统级服务和应用上,几乎只能使用GDB进行调试,并且GDB支持多种不同架构和指令集的CPU,可以支持x86、ARM、MIPS、RISC-V等不同指令集。

    Android系统官方提供了GDB调试工具,可以直接使用。但OpenHarmony官方并未提供GDB调试工具,而要将GDB集成到OpenHarmony系统中编译又是一个非常复杂的事情,一般开发人员很难独自完成。因此将GDB编译成静态链接文件,不依赖任何动态库,这样就可以在OpenHarmony系统上使用,虽然编译后的体积较大一些,但是却可以脱离环境独立运行,是一种很好的解决方案。

原理

     本文的目标是在ARM处理器上运行,因此首先需要构建一个ARM的交叉编译环境。我这里使用的是安装了Ubuntu 2204 Server版本的虚拟机。在交叉编译环境上,通过交叉编译的方式构建ARM版本的GDB可执行程序。以下操作均在该虚拟机系统上完成。

操作步骤

    编译GDB,首先需要安装交叉环境,然后需要交叉编译安装GDB的依赖库,最后就是交叉编译GDB。注意交叉编译环境目录我这里统一设置为--prefix=/home/smile/arm64_gdb/aarch64,大家请根据自己实际情况配置。

    GDB主要依赖的三方库有:liblzma、expat和gmp,需要首先编译这三个库,库的编译也是采用交叉编译,并尽可能的使用静态编译方法,减少动态依赖的产生,防止因为三方库使用动态库而导致GDB无法做成纯静态可执行程序。

1. 安装ARM交叉编译环境

sudo apt install binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi gcc-arm-none-eabi binutils-arm-none-eabi libc6-arm64-cross libc6-armhf-cross g++-12-aarch64-linux-gnu automake m4 autopoint autoconf libtool po4a

2. 编译安装lzma库

git clone https://github.com/ShiftMediaProject/liblzma.git
cd liblzma
./configure --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-12 AR=aarch64-linux-gnu-ar --prefix=/home/smile/arm64_gdb/aarch64 --disable-shared --enable-static
make CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-12 AR=aarch64-linux-gnu-ar
make install

3. 设置PKG环境变量

export PKG_CONFIG_PATH=/home/smile/arm64_gdb/aarch64/lib/pkgconfig

4. 编译expat

wget https://github.com/libexpat/libexpat/releases/download/R_2_4_2/expat-2.4.2.tar.bz2
tar xvf expat-2.4.2.tar.bz2
cd expat-2.4.2
./configure --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-12 AR=aarch64-linux-gnu-ar --prefix=/home/smile/arm64_gdb/aarch64 --disable-shared --enable-static
make CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-12 AR=aarch64-linux-gnu-ar
make install

5. 编译gmp

wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.bz2
tar xvf gmp-6.3.0.tar.gz
cd gmp-6.3.0
./configure --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-12 AR=aarch64-linux-gnu-ar --prefix=/home/smile/arm64_gdb/aarch64 --disable-shared --enable-static
make CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-12 AR=aarch64-linux-gnu-ar
make install

6. 编译GDB

这里我编译的是gdb 12.1版本,经过测试gdb 13.1版本目前还不能通过这种方法进行静态编译。注意gdb版本的选择。

wget https://mirrors.sjtug.sjtu.edu.cn/gnu/gdb/gdb-12.1.tar.gz
tar xvf gdb-12.1.tar.gz
cd gdb-12.1
export CFLAGS="-static"
export CXXFLAGS="-static"
./configure --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-12 AR=aarch64-linux-gnu-ar --prefix=/home/smile/arm64_gdb/aarch64 --disable-shared --enable-static --with-static-standard-libraries --disable-inprocess-agent --without-x --disable-gdbtk --disable-tui --without-include-regex --without-include-gettext
make CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-12 AR=aarch64-linux-gnu-ar -j12
make install

结果验证

smile@ubuntu:~/arm64_gdb/aarch64$ ls -lh bin/gdb*
-rwxr-xr-x 1 smile smile  23M Oct  7 04:22 bin/gdb
-rwxr-xr-x 1 smile smile 4.6K Oct  7 04:22 bin/gdb-add-index
-rwxr-xr-x 1 smile smile 2.5M Oct  7 04:22 bin/gdbserver
smile@ubuntu:~/arm64_gdb/aarch64$ file bin/gdb
bin/gdb: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=e58715b91f485ff8482cfc7308c759c798df4da9, for GNU/Linux 3.7.0, with debug_info, not stripped
smile@ubuntu:~/arm64_gdb/aarch64$ file bin/gdbserver 
bin/gdbserver: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=02324ea1eb1ca9433dbab4c495aa6a6a56e57592, for GNU/Linux 3.7.0, not stripped

gdb和gdbserver已经是静态链接,不依赖任何动态库,可以拷贝到任何ARM的机器上运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值