MD小智

学习-思考-分享


  • 首页

  • 分类

  • 归档

  • 关于我

  • 搜索

在Ubuntu上交叉编译gdb和gdbserver

时间: 2022-08-19   |   分类: 程序员的日常   | 字数: 1497 字 | 阅读: 3分钟 | 阅读次数:

实验环境

  • 开发主机:Ubuntu虚拟机x86_64
  • 目标设备:imx8开发板Linux

准备工作

为了解决在gdb编译过程中出现的configure: error: GMP is missing or unusable错误,我们在编译gdb之前交叉编译一下gmp。

当然,如果交叉编译工具链下有gmp库和gmp.h的话,可以忽略掉这里的准备工作。

  1. 下载源码gmp-6.2.1.tar.xz;

  2. 执行指令tar xvf gmp-6.2.1.tar.xz,解压然后进入文件夹cd gmp-6.2.1;

  3. 根据开发环境的配置方法,导出交叉编译工具链到当前环境变量,我们这里演示设备操作如下:

    source /opt/fslc-framebuffer/2.4.4/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi
    
  4. 执行arm-fslc-linux-gnueabi-gcc -v查看开发主机类型和目标设备类型。比如我们这里的host和build是--build=x86_64-linux和 --host=x86_64-fslcsdk-linux;

    COLLECT_GCC=arm-fslc-linux-gnueabi-gcc
    COLLECT_LTO_WRAPPER=/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/libexec/arm-fslc-linux-gnueabi/gcc/arm-fslc-linux-gnueabi/7.3.0/lto-wrapper
    Target: arm-fslc-linux-gnueabi
    Configured with: ../../../../../../work-shared/gcc-7.3.0-r0/gcc-7.3.0/configure --build=x86_64-linux --host=x86_64-fslcsdk-linux --target=arm-fslc-linux-gnueabi
    ......
    
  5. 执行如下指令,根据当前设备和目标设备进行配置;

    ./configure --host=arm-fslc-linux-gnueabi --build=x86_64-linux --prefix=/home/caeri/lzp/GIT/arm_gmp
    
    • host指目标设备的类型;
    • build指构建设备,也就是我们开发主机的类型;
    • prefix指编译的安装目录;
  6. 配置完成后,效果如下;

    config.status: linking mpn/arm/gmp-mparam.h to gmp-mparam.h
    config.status: executing libtool commands
    configure: summary of build options:
    
      Version:           GNU MP 6.2.1
      Host type:         arm-fslc-linux-gnueabi
      ABI:               32
      Install prefix:    /home/caeri/lzp/GIT/arm_gmp
      Compiler:          arm-fslc-linux-gnueabi-gcc  -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
      Static libraries:  yes
      Shared libraries:  yes
    
  7. 执行make进行编译,编译完成后,结果如下:

    root@ubuntu:/home/caeri/lzp/GIT/gmp/gmp-6.2.1# make
    
    s.o rand/rands.o rand/randsd.o rand/randsdui.o rand/randbui.o rand/randmui.o
    libtool: link: arm-fslc-linux-gnueabi-ranlib .libs/libgmp.a
    libtool: link: rm -fr .libs/libgmp.lax
    libtool: link: ( cd ".libs" && rm -f "libgmp.la" && ln -s "../libgmp.la" "libgmp.la" )
    make[2]: Leaving directory '/home/caeri/lzp/GIT/gmp/gmp-6.2.1'
    make[1]: Leaving directory '/home/caeri/lzp/GIT/gmp/gmp-6.2.1'
    
  8. 执行make install安装到我们指的的安装目录;

    root@ubuntu:/home/caeri/lzp/GIT/gmp/gmp-6.2.1# make install
    
  9. 最后,安装完成后,我们可以在指定的安装目录查看安装结果,这里包含了gmp.h和相关库;

    root@ubuntu:/home/caeri/lzp/GIT/arm_gmp# ls
    include  lib  share
    
  10. 到这里,gmp就编译完了,我们在编译gdb的时候依赖这里的文件。

交叉编译

  1. 在这里下载源码到Ubuntu,我们选择当前比较新的版本gdb-12.1.tar.gz;

  2. 执行tar xvf gdb-12.1.tar.gz解压到当前文件夹;

  3. 根据开发环境的配置方法,导出交叉编译工具链到当前环境变量,我们这里演示设备操作如下:

    source /opt/fslc-framebuffer/2.4.4/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi
    
  4. 执行arm-fslc-linux-gnueabi-gcc -v查看开发主机类型和目标设备类型,以在配置gdb编译过程的时候使用这些参数,比如我们这里的host和build是--build=x86_64-linux和 --host=x86_64-fslcsdk-linux;

  5. 加载配置,这里我们引用了准备工作中编译的gmp库的路径,大家编译的时候要替换成自己的环境;

    ./configure --prefix=/home/caeri/lzp/GIT/arm-gdb --host=arm-fslc-linux-gnueabi --build=x86_64-linux CFLAGS="-I/home/caeri/lzp/GIT/arm_gmp/include -L/home/caeri/lzp/GIT/arm_gmp/lib" CXXFLAGS="-I/home/caeri/lzp/GIT/arm_gmp/include -L/home/caeri/lzp/GIT/arm_gmp/lib"
    
  6. 配置加载完成后,执行make开始编译,这个编译过程可能会耗费5-10分钟~~(设备太慢)~~,很遗憾太激动了没有截图;

    root@ubuntu:/home/caeri/lzp/DC/gdb/gdb-12.1# make
    

    这里如果出现了configure: error: GMP is missing or unusable这个错误,请按照准备工作中,老老实实的编译一遍,再仔细检查上一步configure路径是否配置正确;

  7. 编译完成后,如果没有报错,进入gdbserver文件夹:

    root@ubuntu:/home/caeri/lzp/DC/gdb/gdb-12.1# cd gdbserver
    
  8. 这次,我把gdbserver的安装目录放在了/home/caeri/lzp/GIT/arm-gdbserver,配置如下:

    ./configure --prefix=/home/caeri/lzp/GIT/arm-gdbserver --host=arm-fslc-linux-gnueabi --build=x86_64-linux
    
  9. 然后在目录/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver下,依次执行make、make install,编译安装;

    root@ubuntu:/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver# make
      GEN    version-generated.cc
      CXX    version.o
      CXXLD  gdbserver
      CXXLD  gdbreplay
    root@ubuntu:/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver# make install
    make[1]: Entering directory '/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver'
    n=`echo gdbserver | sed 's,x,x,'`; \
    if [ x$n = x ]; then n=gdbserver; else true; fi; \
    if [ x"" != x ]; then \
    	/bin/bash ./../mkinstalldirs /home/caeri/lzp/GIT/arm-gdbserver/lib; \
    	 /usr/bin/install -c libinproctrace.so /home/caeri/lzp/GIT/arm-gdbserver/lib/libinproctrace.so; \
    fi; \
    /bin/bash ./../mkinstalldirs /home/caeri/lzp/GIT/arm-gdbserver/bin; \
     /usr/bin/install -c gdbserver /home/caeri/lzp/GIT/arm-gdbserver/bin/$n
    mkdir -p -- /home/caeri/lzp/GIT/arm-gdbserver/bin
    make[1]: Leaving directory '/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver'
    
  10. 最后,如果操作成功,我们可以在/home/caeri/lzp/DC/gdb/gdb-12.1/gdbserver下看到我们编译出的gdbserver应用,可以在开发板上运行。

     ./gdbserver
    Usage:  gdbserver [OPTIONS] COMM PROG [ARGS ...]
            gdbserver [OPTIONS] --attach COMM PID
            gdbserver [OPTIONS] --multi COMM
    
    COMM may either be a tty device (for serial debugging),
    
  11. 至此,交叉编译工作完成。

#gdb交叉编译#
微信扫一扫关注

声明:在Ubuntu上交叉编译gdb和gdbserver

链接:https://mdxz2048.github.io/post/study_programmer_cross_compile_for_gdb_on_ubuntu20/

作者:MD小智

声明: 本博客文章除特别声明外,均采用 CC BY-NC-SA 3.0许可协议,转载请注明出处!

创作实属不易,如有帮助,那就打赏博主些许茶钱吧 ^_^
WeChat Pay

微信打赏

Alipay

支付宝打赏

和唯一知道脆司令为什么脆的人散步
自上而下理解内核网络(五)---网络层(IP协议)数据的接收与发送
  • 文章目录
  • 站点概览
MD小智

MD小智

我们会高估自己所拥有的一切!

39 日志
5 分类
48 标签
GitHub
标签云
  • 编码
  • 自上而下理解内核网络
  • 文件同步
  • 12306bypass
  • Asn.1
  • Asn1c编译器
  • Chatgpt
  • D触发器
  • Ean13
  • Gdb交叉编译
  • 实验环境
  • 准备工作
  • 交叉编译
© 2010 - 2024 MD小智
Powered by - Hugo v0.96.0 / Theme by - NexT
/
Storage by GitHub / MD小智
0%