整个学习过程是参考正点原子启明星开发板的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. jQuery validate验证表单隐藏域

    function validInfoForm(){        return $("#form_password").validate({            ignore : ...

  2. Qt QFileSystemModel 的使用

    Model 指的是数据 View 指的是界面,View不用设置,只需要和Model进行绑定,绑定完成之后就是Model的格式了 例子:本例子中QListView QTableView QTreeVie ...

  3. 【攻防世界】catcat-new

    catcat-new 题目来源 攻防世界 NO.GFSJ1168 题解 dirsearch爆破目录,得到http://61.147.171.105:55027/admin,没有有用信息 点开主页的图片 ...

  4. Redis高可用部署:3台服务器打造哨兵集群

    1.Redis集群介绍 Redis 集群(Redis Cluster)是Redis提供的一种分布式部署方式,旨在提供高可用性.如果某个主节点发生故障,集群能够自动进行故障转移,将副本提升为主节点,从而 ...

  5. 【由技及道】在wsl容器中进行远程java开发【人工智障AI2077的开发日志003】

    指令接收:「需要万能开发环境」 系统警报:检测到主人即将陷入"环境配置地狱" 启动救赎协议:构建量子化开发容器 终极目标:让"在我机器上能跑"成为历史文物 需求 ...

  6. 谷歌 Chrome 浏览器离线安装 vue devtools 插件

    由于某些原因,Chrome 应用商店访问不了,所以只能离线安装 vue devtools 插件,离线安装也有两种方法. 方法一:自编译 vue devtools 插件 这方法要求动手能力强的同学. 前 ...

  7. 微信小程序分包体积优化建议

    代码包体积优化 启动性能优化最直接的手段是降低代码包大小,代码包大小直接影响了下载耗时,影响用户启动小程序时的体验. 开发者可以采取以下手段优化代码包体积: 1. 合理使用分包加载 推荐所有小程序使用 ...

  8. IvorySQL 增量备份与合并增量备份功能解析

    1. 概述 IvorySQL v4 引入了块级增量备份和增量备份合并功能,旨在优化数据库备份与恢复流程.通过 pg_basebackup 工具支持增量备份,显著降低了存储需求和备份时间.同时,pg_c ...

  9. oracle 添加白名单- 重启监听

    由于oracle中存在白名单,有新增主机需要访问,添加白名单需要重启监听 1.添加白名单 登陆oracle主机,su - grid 切到grid用户, vi $ORACLE_HOME/network/ ...

  10. Swarm集群部署、集群架构、集群管理 、服务管理

    一.部署swarm集群 #docker swarm简介 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose ...