解决ZYNQ-7020开发板使用vitis编译uboot报错和无法正常调试的问题
整个学习过程是参考正点原子启明星开发板的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不行?
- 文件本质区别:
- **`u-boot`**:这是 U-Boot 编译生成的 **原始二进制文件**(通常为 `u-boot` 或 `u-boot.bin`),默认保留所有符号和调试信息。 - **`u-boot.elf`**:可能是通过 `objcopy` 或其他工具生成的 **ELF 格式文件**,但某些构建流程默认会剥离调试信息(例如使用 `objcopy --strip-debug`),导致调试符号丢失。
- 教程的常见误区:
- 很多教程会混淆 `u-boot` 和 `u-boot.elf`,尤其是 Xilinx 生态中,`.elf` 常用于引导加载或 FPGA 配置,但 U-Boot 的构建流程可能对这两种文件的处理不同。 - 如果教程未明确说明生成调试文件的步骤,直接推荐 `u-boot.elf`,很可能是基于过时的流程或错误假设。
解决ZYNQ-7020开发板使用vitis编译uboot报错和无法正常调试的问题的更多相关文章
- Xamarin开发安装Visual Studio 2015 update2报错的解决办法
Xamarin开发安装Visual Studio 2015 update2报错的解决办法错误信息:update 2 requires a member of the visual studio 201 ...
- 源码编译apache报错的解决方法
源码编译apache报错的解决方法 问题介绍 在源码编译安装httpd时,./configure执行无错误,到make时就报错,在网络上搜索了很多文章,很多方法如换apr-util的低版本并不能很 ...
- 后台程序编译过程报错PCC-F-02104, Unable to connect to Oracle
偶然重新编译了一下后台程序,发现编译过程报错无法连接数据库.但通过sqlplus登录数据库是正常的.后台程序改动中也做了详细的分析,没有改动相关数据库的参数和配置. 最后通过浏览器查看了很多相关问题的 ...
- LINUX下基于NVIDIA HPC SDK 的 VASP6.3.x编译安装报错整理
关于gcc 用旧版本安装NVIDIA HPC SDK再编译会报错: "/opt/rh/devtoolset-8/root/usr/include/c++/8/bits/move.h" ...
- VS编译运行报错:找不到ucrtbased.dll文件
VS编译运行报错:找不到ucrtbased.dll文件 在VS2019中配置OpenCV编译,报如下错误: 解决方法:下载缺少的ucrtbased.dll文件,在免费的dll下载网站搜索下载,对应的有 ...
- 编译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 ...
- idea中编译项目报错 java: javacTask: 源版本 1.8 需要目标版本 1.8
问题如上面所叙: > idea中编译项目报错 java: javacTask: 源版本 1.8 需要目标版本 1.8 解决方案: > Setting->Compiler->Ja ...
- 解决Linux下启动Tomcat遇到Neither the JAVA_HOME ...报错
解决Linux下启动Tomcat遇到Neither the JAVA_HOME ...报错 Neither the JAVA_HOME nor the JRE_HOME environment var ...
- webpack编译sass报错找不到module /css-loader/index.js... || 安装node-sass报错
今天无论在家还是在公司,安装node-sass总是失败,或安装成功了,使用webpack编译sass报错,说找不到module,按照提示的错误我找了node_modules下的css-loader,发 ...
- AXU2CGB开发板验证Vitis加速基本平台创建
Vitis 加速基本平台创建 1.Vivado 工程创建,硬件平台bd 图如下所示 1.1.双击Block图中ZYNQ核,配置相关参数 1.1.1.Low Speed 配置,在 I/O Configu ...
随机推荐
- jQuery validate验证表单隐藏域
function validInfoForm(){ return $("#form_password").validate({ ignore : ...
- Qt QFileSystemModel 的使用
Model 指的是数据 View 指的是界面,View不用设置,只需要和Model进行绑定,绑定完成之后就是Model的格式了 例子:本例子中QListView QTableView QTreeVie ...
- 【攻防世界】catcat-new
catcat-new 题目来源 攻防世界 NO.GFSJ1168 题解 dirsearch爆破目录,得到http://61.147.171.105:55027/admin,没有有用信息 点开主页的图片 ...
- Redis高可用部署:3台服务器打造哨兵集群
1.Redis集群介绍 Redis 集群(Redis Cluster)是Redis提供的一种分布式部署方式,旨在提供高可用性.如果某个主节点发生故障,集群能够自动进行故障转移,将副本提升为主节点,从而 ...
- 【由技及道】在wsl容器中进行远程java开发【人工智障AI2077的开发日志003】
指令接收:「需要万能开发环境」 系统警报:检测到主人即将陷入"环境配置地狱" 启动救赎协议:构建量子化开发容器 终极目标:让"在我机器上能跑"成为历史文物 需求 ...
- 谷歌 Chrome 浏览器离线安装 vue devtools 插件
由于某些原因,Chrome 应用商店访问不了,所以只能离线安装 vue devtools 插件,离线安装也有两种方法. 方法一:自编译 vue devtools 插件 这方法要求动手能力强的同学. 前 ...
- 微信小程序分包体积优化建议
代码包体积优化 启动性能优化最直接的手段是降低代码包大小,代码包大小直接影响了下载耗时,影响用户启动小程序时的体验. 开发者可以采取以下手段优化代码包体积: 1. 合理使用分包加载 推荐所有小程序使用 ...
- IvorySQL 增量备份与合并增量备份功能解析
1. 概述 IvorySQL v4 引入了块级增量备份和增量备份合并功能,旨在优化数据库备份与恢复流程.通过 pg_basebackup 工具支持增量备份,显著降低了存储需求和备份时间.同时,pg_c ...
- oracle 添加白名单- 重启监听
由于oracle中存在白名单,有新增主机需要访问,添加白名单需要重启监听 1.添加白名单 登陆oracle主机,su - grid 切到grid用户, vi $ORACLE_HOME/network/ ...
- Swarm集群部署、集群架构、集群管理 、服务管理
一.部署swarm集群 #docker swarm简介 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose ...