gdb 7.X 下载编译(aarch64)

gdb 7.X 下载编译(aarch64)

1. gdb源码下载

ubuntu系统中有自带的gdb软件,用于跟踪x86体系的程序:
在这里插入图片描述
当然我们要在嵌入式系统中运行的话,还需要抓取源码,进行交叉编译,下载路径:https://ftp.gnu.org/gnu/gdb/
当前最新版本更新到了10.1,这里我下载一个平时常用的版本:7.9 / 7.12

可以直接网页下载:
在这里插入图片描述

也可以命令行下载:

wget http://ftp.gnu.org/gnu/gdb/gdb-7.9.tar.xz

2. 交叉编译工具下载

2.1 搜索支持的工具版本:

sudo apt-cache search aarch64

ubuntu 20.04 中可以搜索到这些版本,我这里安装版本9;
在这里插入图片描述

2.2 下载安装:

sudo apt-get install g+±9-aarch64-linux-gnu
sudo apt-get install g+±aarch64-linux-gnu

2.3 安装完成后查看gcc版本确认是否安装成功

aarch64-linux-gnu-gcc -v
x86_64-linux-gnu-gcc -v

在这里插入图片描述
从上述图示可以说明安装成功;
PS:交叉编译工具链有几个网站会提供,这里直接使用ubuntu apt安装相对方便一些;

3 编译

3.1 aarch64 结构的gdb(7.12)

  1. 解压:

    xz -d gdb-7.12.tar.xz
    tar -xvf gdb-7.12.tar

  2. 配置生成makefile:

    ./configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --prefix=$PWD/output/

  3. 编译:

    make -j8

    错误1:
    在这里插入图片描述
    这里错误是指:TRAP_HWBKPT这个宏在signal-consts.h中有定义且为numeric类型,这里又定义为宏所以出现问题了;
    在这里插入图片描述

    错误2:
    在这里插入图片描述
    C++标准限制不同类型的变量不能直接比较
    将这里修改:在这里插入图片描述

    make
    make install

    编译完成,通过file查看该文件:

在这里插入图片描述
可以看到这个gdb是aarch64 体系文件,可以在aarch64平台运行;

3.2 aarch64 结构的gdb(7.9)

  1. 解压:

    xz -d gdb-7.9.tar.xz
    tar -xvf gdb-7.9.tar

  2. 配置生成makefile:

    ./configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --prefix=$PWD/output/

  3. 编译错误1:

    make -j8

    错误提示:
    在这里插入图片描述
    安装termcap库:

    wget http://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz
    gzip -d termcap-1.3.1.tar.gz
    tar -xvf termcap-1.3.1.tar
    ./configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --prefix=$PWD/…/gdb-7.9/output/

    生成的Makefile中并非使用aarch64编译工具编译,需要修改Makefile:

    vim Makefile

    在这里插入图片描述

    make -8
    make install

    在这里插入图片描述
    termcap生成在了gdb的路径下,然后重新编译gdb

  4. 清除上次编译的结果,重新编译:

    make clean
    make distclean
    ./configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --prefix=$PWD/output/
    make -j8

    出现新的错误:
    在这里插入图片描述
    这里主要是导入系统头文件和gdb自己实现头文件的冲突问题;

    将上述冲突的函数注释掉后即可编译通过,不确认在使用中是否会存在问题;
    在这里插入图片描述

3.3 编译在x86下运行的gdb程序(解析aarch64体系coredump)

  1. 与上述方式类似,在configure时做 不同配置:

    ./configure --host=x86_64-linux-gnu --target=aarch64-linux-gnu --prefix=$PWD/output/
    make j8
    make install

    生成文件:
    在这里插入图片描述

  2. configure的相关配置可以查看:

    ./configure -h

    这里罗列出来上述主要用到的:
    在这里插入图片描述

    build 指当前编译主机的体系结构 host 指编译出来运行程序是跑在哪里,一般与build相同,如果不同则为交叉编译 cross-build target 按照当前理解为编译出来程序是用于目标平台的,用gdb理解就是在x86上运行,解析aarch64