【水】交叉编译GDBserver
调试代码的过程中,GDB+GDBserver是你的不二之选。来看看如何交叉编译使之在aarch64平台上运行!
调试代码的过程中,GDB+GDBserver是你的不二之选。来看看如何交叉编译使之在aarch64平台上运行!
0x00 获取GDB
0x01 解压
tar -xvf gdb-<version>.tar.xz
cd gdb-<version>
0x02 交叉编译
前面都是有手就行,这部分麻烦一点点。以下内容主要参考 https://autotools.info/autoconf/canonical.html 。
0x0200 交叉编译的系统定义
交叉编译的程序有三个角色:host、build与target。
对于不需要交叉编译的应用而言、host=build=target。比如说一个在ubuntu x86_64上运行的gcc/gdb,host=build=target=x86_64-linux-gnu。但是如果我的gdb想要与aarch64平台上运行的gdbserver进行交互,那么此时host=build=x86_64-linux-gnu,target=aarch64-linux-gnu。而对于我想要给aarch64平台编译一个gdbserver,那么host=target=aarch64-linux-gnu(是和aarch64平台上运行的程序进行交互,而非与作为client的gdb),build=x86_64-linux-gnu。
那么这里有一个问题:像是一个webserver,一些例如ping这样的程序,其实是没有必要设置target的。这些软件实际上压根就没有target,毕竟他不需要用来处理别的程序。
0x0201 三元组
三元组(就像i386-redhat-linux-gnu这样)由三个部分组成:架构(architecture),厂商(vendor)和操作系统(operating system)。一般而言,厂商会被予以忽略,而操作系统可能被分为内核和用户空间(比如linux-gnu,实际上是linux kernel+gnu c libraries)。
0x0202 上手!
我们首先编译gdb。在这之前,我们先分析一下三元组:host=build=x86_64-linux-gnu,target=aarch64-linux-gnu。但是因为我在给海思的平台做开发,他们提供的编译器前缀是aarch64-v01c01-linux-gnu,所以我们也要把target变成aarch64-v01c01-linux-gnu,不然就用了我系统上原本装着的交叉编译器了。
mkdir -p build/gdb
mkdir build/gdbserver
cd build/gdb
../../configure --prefix=<your-prefix>/aarch64-v01c01-gdb/ \
--host=x86_64-linux-gnu \
--target=aarch64-v01c01-linux-gnu \
--with-gdb-datadir=<your-prefix>/share/gdb
make -j$(nproc) #我建议设置保守一点点,不然后面可能把内存和cpu全都吃满
make install
接下来处理gdbserver。但是很不幸,新的GDB需要GMP与MPFR,所以我们需要先下载解压,然后也给它们交叉编译了。对于这俩,显然我们只需要设置一个host就行。
cd <gmp-location>/
mkdir build && cd build
../configure --host=aarch64-v01c01-linux-gnu --prefix=$(pwd)/board
make -j && make install
cd <mpfr-location>
mkdir build && cd build
../configure --host=aarch64-v01c01-linux-gnu --prefix=$(pwd)/board --with-gmp=<gmp-location>/build/board
make -j && make install
cd ../gdbserver
../../configure --prefix=$(pwd)/board \
--host=aarch64-v01c01-linux-gnu \
--with-gmp=<gmp-location>/build/board \
--with-mpfr=<mpfr-location>/build/board \
--enable-static
make -j$(nproc)
make install
OK enjoy I guess?