解决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 不行?

  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`,很可能是基于过时的流程或错误假设。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889821.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

markDown学习日记

标题 标题是通过#和一个空格来创建,标题的等级是通过#的个数来鉴别。 字体样式 进步进步进步 加粗效果由2个*前后包裹来实现 进步进步进步 斜体需要一个*来实现 (两者都实现需要三个*) 进步进步进步 删除需要两边都用波浪号 ~ 实现 引用明德新民 止于至善用>实…

LVM(Logical Volume Manager)

一. LVM概述 1. 什么是 LVM LVM(Logical Volume Manager,逻辑卷管理器)是 Linux 系统下的一种 存储管理 机制,能够灵活地管理磁盘分区。它提供了一种比传统分区管理(如fdisk、parted)更高级的存储管理方式,允许动态调整存储空间,方便扩展和缩减分区,而不会影响已有数据…

碎片

平板电脑和手机最大的区别就在于屏幕的大小, 一般手机屏幕的大小会在 3 英寸到 6 英寸之间, 而一般平板电脑屏幕的大小会在 7 英寸到 10 英寸之间。屏幕大小差距过大有可能会让同样的界面在视觉效果上有较大的差异, 比如一些界面在手机上看起来非常美观, 但在平板电脑上看起来就…

作业1 随笔

这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 学习使用markdown、博客园与GitHub,大致了解本学科1、自我介绍兴趣爱好:玩游戏,打羽毛球,喜欢拍照,喜欢理解学习软件工程专业的新东西 学习方面:主要学习Java,2、5个想弄懂的问题从事后…

NetPad:一个.NET开源、跨平台的C#编辑器

前言 今天大姚给大家分享一个基于.NET开源、跨平台的C#编辑器和游乐场:NetPad。 项目介绍 NetPad是一个基于.NET开源(MIT License)、跨平台的C#编辑器和游乐场,它允许用户立即运行C#代码,无需创建和管理项目。项目技术栈.NET:作为底层框架,提供强大的开发能力和跨平台支…

upload-labs/Pass-18条件竞争绕过

根据代码可以看出,Pass-18 先保存了文件然后再判断文件是否合法,不合法就删除文件; 其他文件上传漏洞都是先判断文件是否合法然后再保存文件 因此可以知道,我们上传的不合法的文件是可以传到服务器的,在上传到服务器和文件删除之间会有一个间隙 我们可以利用这个间隙来绕过…

14 Java的Stream流详解

Stream是[Java 8](https://so.csdn.net/so/search?q=Java 8&spm=1001.2101.3001.7020) API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)Stream流是从支持数据处理操作的源生成的元素…

作业1:自我介绍+软工五问

项目 内容这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13325这个作业的目标 熟练掌握github、git、markdown和博客园的使用1.…

基于电压电流双闭环控制的三相整流器系统simulink建模与仿真

1.课题概述 基于电压电流双闭环控制的三相整流器系统simulink建模与仿真。2.系统仿真结果 (完整程序运行后无水印)3.核心程序与模型 版本:MATLAB2022a4.系统原理简介三相整流器作为电力电子变换的核心部件,广泛应用于各种工业及能源系统中,其性能直接影响到整个系统的效率…

[BUUCTF]刷题记录PWN——ez_pz_hackover_2016

静态分析比较重要的函数,一个strlen可以利用\x00来绕过,然后对输入的字符串进行检查,最后进入vulnmemcoy: C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。也就是说,vuln里的memcpy函数会把,我们输入的内容取…

基于信息论的高动态范围图像评价算法matlab仿真

1.程序功能描述 基于信息论的高动态范围图像评价算法matlab仿真,利用一种自然图像的概率模型对图像的熵与成像动态范围之间的关系进行了数值模拟,得到了具有普遍意义上的理想成像动态范围的计算公式,公式指出了对自然景物完善成像所需的最大动态范围;给出了图像熵与动态…