【水】交叉编译GDBserver

调试代码的过程中,GDB+GDBserver是你的不二之选。来看看如何交叉编译使之在aarch64平台上运行!

【水】交叉编译GDBserver
Photo by Alexandru Tabusca / Unsplash
调试代码的过程中,GDB+GDBserver是你的不二之选。来看看如何交叉编译使之在aarch64平台上运行!

0x00 获取GDB

Download 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?