整个学习过程是参考正点原子启明星开发板的2020.2版本嵌入式Linux开发指南,在学习uboot移植的时候遇到了问题。

新建工程和配置环境啥的和教程里都一样,就不罗嗦了,这里重点讲和教程不一样的地方(或者说教程里有问题的地方)。

新建工程后编译时遇到的报错

在按照教程新建uboot的vitis工程后出现如下报错:



这里截图截的不太对,具体的问题是在编译到gpio-uclass.c这个文件时报错,说找不到 dt-bindings/gpio/gpio.h 这个头文件。这个其实挺邪门,uboot工程里大几百个头文件,这个和其他的一样平平无奇的躺在那,凭啥就你找不到?

不过我点开了这个头文件,发现里面只有寥寥几行宏定义,并且只有gpio-uclass.c里include了这个头文件,于是我就干脆把那些宏定义复制进了gpio-uclass.c里面,如下所示:



然后编译就通过了(离谱),并且编译出的elf文件可以正常从sd卡启动(不排除有隐藏bug的可能,但是以我十年c语言编程的经验()来看,把一些宏定义从头文件copy到c文件对程序应该产生不了太大影响)。至于编译的时候为什么找不到那个文件我还是不懂。

无法通过vitis正常调试

然后按照原子的教程,可以通过vitis直接将编译好的程序用jtag下载到板上然后可以调试打断点之类的。按照教程,选择u-boot.elf文件下进板子里,如下图所示:

然后可以下进去,但是无法正常调试,显示的反汇编结果如下所示:

也没法正常设置断点:

先说结论,debug时要选择下载的程序应该是u-boot,而不是u-boot.elf,如下图所示:

接下来是调试历程

自己实在解决不了,去问了deepseek,根据他的提示一步一步测试,使用readelf -wl u-boot.elf命令测试,发现没有任何输出,deepseek说没有输出表明该文件里不包含调试信息。在起初我还以为是我的编译的方法有问题,导致没有生成相应的调试信息,然后按照这个思路去查,然后抓耳挠腮了两三天,后来终于在和deepseek的交谈中发现了玄机,他这么和我说:

3. 验证调试信息

重新编译后,检查 u-boot(不是 u-boot.elf):

arm-xilinx-linux-gnueabi-readelf -S u-boot | grep debug

arm-xilinx-linux-gnueabi-nm u-boot | grep board_f

  • 期望输出

    [27] .debug_info PROGBITS 00000000 001160 00055d 00 0 0 1

    00000000 T board_f

我才知道调试信息在u-boot里面,而不是u-boot.elf。然后我还问了他这两个文件的区别:

为什么 u-boot 能用而 u-boot.elf 不行?

  1. 文件本质区别
- **`u-boot`**:这是 U-Boot 编译生成的 **原始二进制文件**(通常为 `u-boot` 或 `u-boot.bin`),默认保留所有符号和调试信息。

- **`u-boot.elf`**:可能是通过 `objcopy` 或其他工具生成的 **ELF 格式文件**,但某些构建流程默认会剥离调试信息(例如使用 `objcopy --strip-debug`),导致调试符号丢失。
  1. 教程的常见误区
- 很多教程会混淆 `u-boot` 和 `u-boot.elf`,尤其是 Xilinx 生态中,`.elf` 常用于引导加载或 FPGA 配置,但 U-Boot 的构建流程可能对这两种文件的处理不同。

- 如果教程未明确说明生成调试文件的步骤,直接推荐 `u-boot.elf`,很可能是基于过时的流程或错误假设。

解决ZYNQ-7020开发板使用vitis编译uboot报错和无法正常调试的问题的更多相关文章

  1. Xamarin开发安装Visual Studio 2015 update2报错的解决办法

    Xamarin开发安装Visual Studio 2015 update2报错的解决办法错误信息:update 2 requires a member of the visual studio 201 ...

  2. 源码编译apache报错的解决方法

    源码编译apache报错的解决方法   问题介绍 在源码编译安装httpd时,./configure执行无错误,到make时就报错,在网络上搜索了很多文章,很多方法如换apr-util的低版本并不能很 ...

  3. 后台程序编译过程报错PCC-F-02104, Unable to connect to Oracle

    偶然重新编译了一下后台程序,发现编译过程报错无法连接数据库.但通过sqlplus登录数据库是正常的.后台程序改动中也做了详细的分析,没有改动相关数据库的参数和配置. 最后通过浏览器查看了很多相关问题的 ...

  4. LINUX下基于NVIDIA HPC SDK 的 VASP6.3.x编译安装报错整理

    关于gcc 用旧版本安装NVIDIA HPC SDK再编译会报错: "/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/move.h" ...

  5. VS编译运行报错:找不到ucrtbased.dll文件

    VS编译运行报错:找不到ucrtbased.dll文件 在VS2019中配置OpenCV编译,报如下错误: 解决方法:下载缺少的ucrtbased.dll文件,在免费的dll下载网站搜索下载,对应的有 ...

  6. 编译PHP 报错:node.c: In function dom_canonicalization

    编译PHP 报错:node.c: In function dom_canonicalization  /opt/php-5.2.17/ext/dom/node.c:1953: error: deref ...

  7. idea中编译项目报错 java: javacTask: 源版本 1.8 需要目标版本 1.8

    问题如上面所叙: > idea中编译项目报错 java: javacTask: 源版本 1.8 需要目标版本 1.8 解决方案: > Setting->Compiler->Ja ...

  8. 解决Linux下启动Tomcat遇到Neither the JAVA_HOME ...报错

    解决Linux下启动Tomcat遇到Neither the JAVA_HOME ...报错 Neither the JAVA_HOME nor the JRE_HOME environment var ...

  9. webpack编译sass报错找不到module /css-loader/index.js... || 安装node-sass报错

    今天无论在家还是在公司,安装node-sass总是失败,或安装成功了,使用webpack编译sass报错,说找不到module,按照提示的错误我找了node_modules下的css-loader,发 ...

  10. AXU2CGB开发板验证Vitis加速基本平台创建

    Vitis 加速基本平台创建 1.Vivado 工程创建,硬件平台bd 图如下所示 1.1.双击Block图中ZYNQ核,配置相关参数 1.1.1.Low Speed 配置,在 I/O Configu ...

随机推荐

  1. QT5笔记:33. 坐标系统和坐标变换

    例子:重写widget的painterEvent MainWindow.cpp void Widget::paintEvent(QPaintEvent *event) { QPainter paint ...

  2. 探秘Transformer系列之(6)--- token

    探秘Transformer系列之(6)--- token 0x00 概述 语言是人类特有的概念.作为一个抽象符号,人是可以理解每个语言单词的意义的,但是现在的NLP语言模型无法直接的从感知中抽象出每个 ...

  3. 使用Go复刻skiplist核心功能

    0.引言 正好做LC每日一题要求实现一个跳表,于是学习了redis的扩展skiplist,并使用Go进行复刻学习.学习参考了文章:Redis内部数据结构详解(6)--skiplist - 铁蕾的个人博 ...

  4. 最新版go-cqhttp的sign 签名服务器搭建教程

    安装go-cqhttp 传送门 自建sign签名服务器容器: 拉取镜像(只支持amd64) docker pull hansaes/unidbg-fetch-qsign:latest 启动容器 doc ...

  5. 面试题32 - I. 从上到下打印二叉树

    地址:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/ <?php /** 从上到下打印出二 ...

  6. 【前端解决方案】已有本地项目如何建立github仓库

    步骤 1:在本地初始化 Git(如果还没初始化) 如果你的本地项目还没有 Git 仓库,先进入你的项目目录,并初始化 Git:   cd /你的本地项目路径 git init 这样会在你的项目中创建一 ...

  7. 【数值计算方法】2&3维高斯积分的python实现

    目录 二维高斯积分 三维高斯积分 验证 本文只给出pythont实现和例题,数学推导见[数值计算方法]数值积分&微分-python实现 - FE-有限元鹰 - 博客园 二维高斯积分 pytho ...

  8. linux 源码安装完php后在目录下找不到php.ini的问题

    首先,我们需要确定php版本的php.ini文件需要放在个目录下 我们先执行以下命令查看php的php.ini目录应该放在那个地方 php -i |grep php.ini 效果如下,现在我们确定好了 ...

  9. 【离线地图】地图瓦片css复杂滤镜线段绘制

    需求: 目前已经对地图瓦片做了复杂滤镜的黑夜展示,现在又要在这个图片上绘制新的线段等内容,且不能被这个复杂滤镜影响,变成奇奇怪怪的颜色. 同时因为框架限制,只能在这个img上绘制 思考: 1.既然不想 ...

  10. 包装类面试题--java进阶day05

    1.面试题 如下两个输出,请问分别是true还是false呢? 答案: 当范围在-128~127时,对象相同就会返回true 在讲解这个问题之前,先了解自动装箱的原理 2.自动装箱的原理 自动装箱,就 ...