交叉编译 gdb

交叉编译 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.

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

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
森林防火应急联动指挥系统是一个集成了北斗定位/GPS、GIS、RS遥感、无线网络通讯、4G网络等技术的现代化智能系统,旨在提高森林火灾的预防和扑救效率。该系统通过实时监控、地图服务、历史数据管理、调度语音等功能,实现了现场指挥调度、语音呼叫通讯、远程监控、现场直播、救火人员生命检测等工作的网络化、智能化、可视化。它能够在火灾发生后迅速组网,确保现场与指挥中心的通信畅通,同时,系统支持快速部署,适应各种极端环境,保障信息的实时传输和历史数据的安全存储。 系统的设计遵循先进性、实用性、标准性、开放性、安全性、可靠性和扩展性原则,确保了技术的领先地位和未来的发展空间。系统架构包括应急终端、无线专网、应用联动应用和服务组件,以及安全审计模块,以确保用户合法性和数据安全性。部署方案灵活,能够根据现场需求快速搭建应急指挥平台,支持高并发视频直播和大容量数据存储。 智能终端设备具备三防等级,能够在恶劣环境下稳定工作,支持北斗+GPS双模定位,提供精确的位置信息。设备搭载的操作系统和处理器能够处理复杂的任务,如高清视频拍摄和数据传输。此外,设备还配备了多种传感器和接口,以适应不同的使用场景。 自适应无线网络是系统的关键组成部分,它基于认知无线电技术,能够根据环境变化动态调整通讯参数,优化通讯效果。网络支持点对点和点对多点的组网模式,具有低功耗、长距离覆盖、强抗干扰能力等特点,易于部署和维护。 系统的售后服务保障包括安装实施服务、系统维护服务、系统完善服务、培训服务等,确保用户能够高效使用系统。提供7*24小时的实时故障响应,以及定期的系统优化和维护,确保系统的稳定运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iBlackAngel

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值