gdbserver-all-in-one手册
What
为了方便,弄一个全架构全版本的 gdbserver 集合。全部 gdbserver 使用静态编译,减少对函数库的依赖。
How
用 github action 托管编译构造,大概步骤:
- buildroot 构造交叉编译工具
- 交叉编译 gdbserver
交叉编译工具
处理 buildroot 的环境依赖,克隆源码:
1 | # 安装依赖库 |
清理残余文件,之后图形化生成新的配置文件:
1 | # 进行编译的配置 |
下面在初始情况下,需要修改的配置项目(以生成 armv8-linux-glibc 为例子):
Target Option
–Target Architecture
修改为ARM(little endian)
勾选
Toolchain
-Enable C++ support
开启 C++ 支持,会多一个 g++Toolchain
–Kernel Headers
修改为小于等于主机内核的版本 (查询指令:uname -r),我本地为 4.15.0 ,那就选 4.14.x勾选
Target packages
-Libraries
-Other
-gmp
配置文件保存在 buildroot 根目录下的 .config ,将 .config 复制到新的机器上就不需要二次配置了。
编译过程会下载国外资源,保持网络通畅。托管 github action 不需要考虑:
1 | make -j8 |
编译完成后在 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 | wget https://ftp.gnu.org/gnu/gdb/gdb-${GDB_VERSION}.tar.gz |
- –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
6sudo 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:
1
2
3
4
5
6
7sudo 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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14wget 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=-static1
2
3
4
5
6
7
8
9
10
11
12
13
14wget 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