当前位置: 首页 > article >正文

交叉编译 gdb

文章目录

  • 交叉编译 gdb
    • 1 概述
    • 2 源码下载
    • 3 交叉编译

交叉编译 gdb

1 概述

gdb logo

GDB 是 GNU Debugger 的简称,是一款功能强大的源码级调试工具,尤其在 Linux 生态系统中占据着举足轻重的地位。它允许程序员在程序运行时检查其内部结构和内存使用情况。GDB 是 GNU 项目的一部分,专为使用 GNU 编译器集合(GCC)编译的程序而设计,但它也支持许多其他编译器和编程语言。

GDB 提供了丰富的调试功能,包括但不限于:

  • 设置断点:允许程序在特定位置暂停执行,以便程序员可以检查此时程序的状态。
  • 单步执行:允许程序员一次执行一行代码,以便逐步跟踪程序的执行流程。
  • 查看变量和内存:GDB 可以显示程序中变量的当前值,以及内存中的特定内容。
  • 调用栈查看:显示程序当前的函数调用栈,帮助程序员理解函数的调用顺序和上下文。
  • 条件断点:允许程序员设置仅在满足特定条件时才触发的断点。
  • 观察点:当特定内存地址或变量的值发生变化时,GDB 可以自动暂停程序。
  • 反汇编查看:对于需要深入了解底层机器码的用户,GDB 可以显示程序的汇编代码。
  • 远程调试:GDB 支持通过网络对远程机器上的程序进行调试。

GDB 通常在命令行界面(CLI)中使用,但它也支持图形用户界面(GUI)的前端,如 DDD、Eclipse CDT(C/C++ Development Tooling)插件等,这些前端提供了更直观的调试体验。

使用 GDB 进行调试通常需要程序员具备一定的编程知识,以及对操作系统和编译器的理解。然而,一旦掌握了 GDB 的基本用法,它将成为解决复杂程序问题的强大工具。

在使用 GDB 之前,通常需要在编译程序时加入调试信息(例如,使用 GCC 的 -g 选项),以便 GDB 能够准确地显示源代码和变量信息。此外,GDB 还提供了大量的命令行选项和调试命令,以满足不同用户的调试需求。

官方网址: https://www.sourceware.org/gdb

gdb websit

注意:gdb 依赖 gmp 库与 mpfr 库,所以在正式开始交叉编译 gdb 之前需要确保编译工具链中已经准备好了以下两个库,否则会在开始 ./configure 的时候出现依赖错误。

checking for the correct version of gmp.h... no
configure: error: Building GDB requires GMP 4.2+, and MPFR 3.1.0+.
Try the --with-gmp and/or --with-mpfr options to specify
their locations.  If you obtained GMP and/or MPFR from a vendor
distribution package, make sure that you have installed both the libraries
and the header files.  They may be located in separate packages.

gmp 库与 mpfr 库的交叉编译流程可以参考「交叉编译 gmp」与「交叉编译 mpfr」。

2 源码下载

在官方网址点击 download 链接进入下载页面,您可以从 GNU 项目的 HTTPS 服务器或 Red Hat 的源代码网站下载 GDB 的最新官方版本:

https://ftp.gnu.org/gnu/gdb (mirrors)
https://sourceware.org/pub/gdb/releases/ (mirrors)

也可以使用 wget 下载最新版本(GDB 15.1):

wget https://ftp.gnu.org/gnu/gdb/gdb-15.1.tar.xz

GDB 的源码使用 Git 进行版本管理,在「Source code」中有详细的介绍,你可以使用以下指令克隆一个 GDB 只读仓库。

git clone https://sourceware.org/git/binutils-gdb.git

3 交叉编译

解压缩源码包,如果使用 git clone 下载回来的源码可以忽略这一步。

tar -xvf gdb-15.1.tar.xz 

解压缩源码包之后建议先阅读 README 文档,里面有关于编译的相关信息。

GDB 支持的是 GNU Build System 编译系统,简单理解就是 Unix 经典编译三部曲: ./configure, make, make install

在进行交叉编译前,首先创建一个环境配置文件 aarch64-environment-setup,配置最重要的交叉编译环境变量:

aarch64-environment-setup:

export TOOLCHAIN_ROOT=/opt/toolchains/aarch64--glibc--stable-2022.03-1
export BUILDSYSROOT=$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysroot
export PATH=$TOOLCHAIN_ROOT/bin:$PATH

export PREFIX=/usr

export CC="aarch64-linux-gcc --sysroot=$BUILDSYSROOT"
export CXX="aarch64-linux-g++ --sysroot=$BUILDSYSROOT"
export CPP="aarch64-linux-gcc -E --sysroot=$BUILDSYSROOT"
export LD="aarch64-linux-ld --sysroot=$BUILDSYSROOT"
export AR=aarch64-linux-ar
export AS=aarch64-linux-as
export NM=aarch64-linux-nm
export GDB=aarch64-linux-gdb
export OBJDUMP=aarch64-linux-objdump
export OBJCOPY=aarch64-linux-objcopy
export RANLIB=aarch64-linux-ranlib
export READELF=aarch64-linux-readelf
export STRIP=aarch64-linux-strip

export CONFIGURE_FLAGS="--host=aarch64-linux --build=x86_64-linux"

export PKG_CONFIG_SYSROOT_DIR=$BUILDSYSROOT
export PKG_CONFIG_PATH=$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig

在本示例中,交叉编译工具位于 /opt/toolchains/aarch64--glibc--stable-2022.03-1/bin 目录下,将该目录配置到 PATH 环境变量,让系统能够正确搜索到。同时在配置 CCCXXCPPLD 环境变量时指定 --sysroot=<dir> 参数让交叉编译器搜索 dir 目录下的头文件与库文件,而不是 /usr/include/usr/lib

cd gdb-15.1
source aarch64-environment-setup
./configure --prefix=/usr $CONFIGURE_FLAGS
make
make DESTDIR=$BUILDSYSROOT install
  • 源码包解压后,使用 cd 命令切换到源码路径
  • 在源码目录下创建环境设置文件并调用 source 命令让环境变量生效
  • 执行源码包的 configure 文件,带上 --prefix 参数,指定安装路径。在配置文件中定义了临时的 CONFIGURE_FLAGS 来指定 --host--build 选项的值,具体的说明可以使用 ./configure --help 命令进行查阅
  • 执行 make 命令编译源码
  • 使用 DESTDIR 参数作为安装目标文件的前缀变量,后面带上你希望安装到的文件夹路径,详细介绍可以参考 DESTDIR 官方介绍。或者参考我的博文「交叉编译 gmp」关于 DESTDIR 的用法说明。

最终你就可以在环境变量定义的 $BUILDSYSROOT 目录中找到交叉编译好的 gdb 的可执行文件、头文件及库文件。你可以指定 DESTDIR=/tmp/fakeroot 则整个 gdb 的产物会统一放在 /tmp/fakeroot 目录下,方便部署验证。

make DESTDIR=/tmp/fakeroot install

注意

如果在执行构建过程中提示:

libtool: link: cannot find the library `/usr/lib/libgmp.la' or unhandled argument `/usr/lib/libgmp.la'

可以手动删除 sysroot 目录下的所有 .la 文件进行解决:

rm $BUILDSYSROOT/usr/lib/*.la

关于 libtool.la 的说明详见我的另一篇博文。

Good luck.

欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景


http://www.kler.cn/a/288953.html

相关文章:

  • 为什么海外服务器IP会被封
  • 【数据结构】AVL树
  • 「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024
  • golang使用etcd版本问题
  • 【PowerHarmony】电鸿蒙学习记录-编写helloworld!
  • 微服务day08
  • HarmonyOS开发实战( Beta5版)优化实践/合理使用缓存提升性能
  • Linux 命令行快捷键
  • Netty Reactor面试连环问
  • 学习笔记 ---- 莫比乌斯反演总结
  • Spring Boot 入门
  • 5款手机版的影视解说文案生成器,无须下载更方便!
  • linux下cpu多核运行程序以及运行时间统计
  • 物联网(IoT)支持的小型水处理厂实时硬件在环(HIL)仿真
  • 角谷猜想——考拉兹猜想
  • 《OpenCV计算机视觉》—— 图像边缘检测
  • day4 C++
  • 【STM32】IIC
  • mongodb 在 Windows 环境下迁移数据库的问题
  • Linux:手搓shell
  • 解析淘宝商品详情API返回值中的特殊属性
  • python系列教程231——__init__.py
  • Docker php文件本地包含--pearcmd.php利用
  • Prometheus+Grafana监控数据可视化
  • 反序列化漏洞(一)
  • flume系列之:批量并行启动、停止、重启flume agent组