What

为了方便,弄一个全架构全版本的 gdbserver 集合。全部 gdbserver 使用静态编译,减少对函数库的依赖。

How

用 github action 托管编译构造,大概步骤:

  1. buildroot 构造交叉编译工具
  2. 交叉编译 gdbserver

交叉编译工具

处理 buildroot 的环境依赖,克隆源码:

1
2
3
4
5
6
7
# 安装依赖库
sudo apt-get update
sudo apt-get install libncurs*
sudo apt-get install libncurses5-dev patch

# 下载源码
git clone https://github.com/buildroot/buildroot.git

清理残余文件,之后图形化生成新的配置文件:

1
2
3
4
# 进行编译的配置
cd buildroot
make clean
make menuconfig

下面在初始情况下,需要修改的配置项目(以生成 armv8-linux-glibc 为例子):

  • Target OptionTarget Architecture 修改为 ARM(little endian)

  • 勾选 Toolchain-Enable C++ support 开启 C++ 支持,会多一个 g++

  • ToolchainKernel Headers 修改为小于等于主机内核的版本 (查询指令:uname -r),我本地为 4.15.0 ,那就选 4.14.x

  • 勾选 Target packages-Libraries-Other-gmp

配置文件保存在 buildroot 根目录下的 .config ,将 .config 复制到新的机器上就不需要二次配置了。

编译过程会下载国外资源,保持网络通畅。托管 github action 不需要考虑:

1
2
make -j8
make install

编译完成后在 output/host/bin 文件夹就能看到文件了。如果需要移动交叉编译工具,将整个 output/host 复制到新的机器即可。

host 文件夹就是交叉编译工具,output 下其他文件夹自行百度谷歌。

output/host/bin 添加环境变量 PATH 方便调用:

1
export PATH=<buildroot_path>/output/host/bin:$PATH

静态编译 gdbserver

gdbserver 是 gdb 项目里面的一个配套软件,开始计划直接编译全套 gdb ,由于静态编译与 libgmp 冲突未解决,最后修改为只静态编译 gdbserver 。

拉去源码,配置后编译:

1
2
3
4
5
6
7
8
9
10
11
12
wget https://ftp.gnu.org/gnu/gdb/gdb-${GDB_VERSION}.tar.gz
tar xf gdb-${GDB_VERSION}.tar.gz
cd gdb-${GDB_VERSION}
mkdir build
mkdir out
cd build
../configure\
--prefix=${HOMEDIR}/gdb-${GDB_VERSION}/out\
--program-prefix=${TARGETARCH}-linux-${GDB_VERSION}-\
--host=${TARGETARCH}-linux
make -j16 all-gdbserver CFLAGS=-static CXXFLAGS=-static
make install-strip-gdbserver
  • –prefix:安装目录
  • –program-prefix:编译安装 ELF 前缀
  • –host:交叉编译工具前缀
  • CFLAGS:C 编译器额外参数,用于指定静态编译
  • CXXFLAGS:C++ 编译器额外参数,用于指定静态编译

最后在 ${HOMEDIR}/gdb-${GDB_VERSION}/out/bin 下可以找到 gdbserver

Build by yourself

coming soon…

BUG

gdb 无法静态编译

gdb 编译需要 gmp 库,当使用静态编译时,会出现 GMP is missing or unusable 错误(动态编译没有问题),尝试以下方法均未解决:

  • Apt 安装 libgmp

    1
    2
    3
    4
    5
    6
    sudo apt-get install -y libgmp-dev libgmp3-dev
    ../configure\
    --prefix=${HOMEDIR}/gdb-${GDB_VERSION}/out\
    --program-prefix=${TARGETARCH}-linux-${GDB_VERSION}-\
    --host=${TARGETARCH}-linux
    make -j16 CFLAGS=-static CXXFLAGS=-static
  • 指定使用交叉编译工具库下的 libgmp:

    http://emb.hqyj.com/Column/Column926.htm

    1
    2
    3
    4
    5
    6
    7
    sudo apt-get install -y libgmp-dev libgmp3-dev
    ../configure\
    --prefix=${HOMEDIR}/gdb-${GDB_VERSION}/out\
    --program-prefix=${TARGETARCH}-linux-${GDB_VERSION}-\
    --host=${TARGETARCH}-linux
    LDFLAGS="-L${HOMEDIR}/buildroot/output/host/lib"
    make -j16 CFLAGS=-static CXXFLAGS=-static
  • 自编译安装 gmp :

    https://codeantenna.com/a/sFxr8sCODH

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.2.0.tar.bz2
    tar -xvf gmp-6.2.0.tar.bz2
    cd gmp-6.2.0/
    ./configure --prefix=/usr/local/gmp-6.2.0
    make && sudo make install

    cd ../gdb-11.2/build
    sudo apt-get install -y libgmp-dev libgmp3-dev
    ../configure\
    --prefix=${HOMEDIR}/gdb-${GDB_VERSION}/out\
    --program-prefix=${TARGETARCH}-linux-${GDB_VERSION}-\
    --host=${TARGETARCH}-linux
    LDFLAGS="-L/usr/local/gmp-6.2.0"
    make -j16 CFLAGS=-static CXXFLAGS=-static
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    wget ftp://ftp.gnu.org/gnu/gmp/gmp-6.2.0.tar.bz2
    tar -xvf gmp-6.2.0.tar.bz2
    cd gmp-6.2.0/
    ./configure --prefix=/usr/local/gmp-6.2.0
    make && sudo make install

    cd ../gdb-11.2/build
    sudo apt-get install -y libgmp-dev libgmp3-dev
    ../configure\
    --prefix=${HOMEDIR}/gdb-${GDB_VERSION}/out\
    --program-prefix=${TARGETARCH}-linux-${GDB_VERSION}-\
    --host=${TARGETARCH}-linux
    --with-gmp=/usr/local/gmp-6.2.0
    make -j16 CFLAGS=-static CXXFLAGS=-static