【U-Boot】解决U-Boot的“Unknown command 'help' - try 'help'”问题
【U-Boot】解决U-Boot的“Unknown command 'help' - try 'help'”问题
零、起因
最近在玩U-Boot,自己编译U-Boot之后输入help
命令发现提示Unknown command 'help' - try 'help'
,就此记录解决过程。
壹、解决过程
0x00
搜索源码,使用grep
命令查找弹出这个提示的位置:
显示在common/command.c
中。
0x01
修改common/command.c
打印一些调试信息,帮助我更进一步确定问题所在位置:
再次运行,发现table_len
为0:
0x02
发现问题:
尝试再次修改代码,追溯table_len
变量,发现这个ll_entry_count
是一个叫链接器的东西:
相关代码:
1
##
是表示连接两个字符串,例如:有定义#defined a(x,y) x##y
,则a(i,j)
最终生成为ij
。
这里会连接生成_u_boot_list_cmd__start
和_u_boot_list_cmd__end
,然后大小就是这两个的差值,那么这两个变量又是在哪的呢?
2
这段中的_u_boot_list_cmd__start
和_u_boot_list_cmd__end
是自定义的符号,而.
在链接器脚本里代表当前地址,可以用extern
关键字声明这两个符号,获得与当前段相关的地址。
在*(SORT(.u_boot_list.cmd.*))
中,*()
是链接器脚本里的通配符语法,例如:*(pattern)
会将所有目标文件中名为pattern
的段内容合并到当前段中。
这里的pattern
是.u_boot_list.cmd.*
,表示会匹配所有以.u_boot_list.cmd.
开头的段。
而SORT()
是链接器脚本提供的排序函数,它能对匹配的段进行排序(排序的依据通常是段名)。
所以,28行的代码意思是将所有目标文件中符合.u_boot_list.cmd.*
模式的段内容收集起来,排序后合并到当前正在定义的段中。
3
其中U_BOOT_CMD
是所有命令用来注册的宏。
其中section
属性允许开发者把变量或函数放置到自定义的段中。
写好命令相关的代码后用U_BOOT_CMD
宏来注册,这样会被统计到对应段中。
调试:
这样我们声明一下这两个符号,尝试看看这个段的地址是怎样的:
运行结果:
开始地址和结束地址一样,难道是没匹配上?还是没编译进去?
0x03
查看help
命令的代码:
有的。
再看镜像中是否被编译进去了:
有的。
那就是没匹配上咯?或者说是链接器有兼容性问题?
使用arm-none-linux-gnueabi-objdump
检查段信息:
就是说,编译了……
再看u-boot.map
:
诶?被_u_boot_list_
先匹配去了,后面的_u_boot_list_cmd_
和_u_boot_list_env_clbk_
都没分到内容!
咋办?
0x04
通过搜索命令,我们最终可以大致确认原始脚本位置:
替换一下位置:
生成后发现没用,经检查发现是u-boot.lst
被重新生成了。
0x05
好,上面的u-boot.lst
也是生成的,由make_u_boot_list
生成:
函数在helper.mk
中,我们让这个函数失效:
再次修改u-boot.lst
后重新编译,刷写到 SD 卡。
0x05
成功了!
晚安,搞到了凌晨四点,明天还有早八 QwQ ~
贰、总结
对于此类问题,grep
是一个不错的命令,能快速找到位置,再由那个位置一层一层往上找就能找到问题所在。
第一次接触U-Boot源码,本次找错的过程让我对U-Boot命令相关的部分有了一定了解,自己花点时间写个命令的“Hello world”应该是没问题了。
另外,也是第一次研究.map
文件、.lst
文件和.lds
文件,对链接和文件布局相关的东西都有了一定的了解,下次遇到这个问题不会找好久了,hahahah。
加深了对arm-none-linux-gnueabi-objdump
命令的理解,它在本次排错中提供了比较重要的信息。
对U-Boot的编译、镜像制作和刷写更加熟练了。
晚安~ ( 早安!感谢豆包~ )
叁、参考
- https://www.doubao.com/thread/w4ea6b9d8ece3d7e9
- https://www.doubao.com/thread/w16f419b17f0e9afe
- https://www.doubao.com/thread/w2cd5264f38dd2ff8
- https://www.doubao.com/thread/w2cd5264f38dd2ff8
- https://www.doubao.com/thread/w2cd5264f38dd2ff8
- https://www.doubao.com/thread/wef34dbca2d2d6605
- https://www.doubao.com/thread/w7eec8793d6766c13
【U-Boot】解决U-Boot的“Unknown command 'help' - try 'help'”问题的更多相关文章
- 如何解决spring boot 项目导入依赖后代码报错问题
如何解决spring boot 项目导入依赖后代码报错问题 2020-08-15 14:17:18 代码截图如图所示(由于本人问题已经解决,没来得及截图,所以在网上找了一张图片)
- spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500:no convertter for return value of type
问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json ...
- 解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level
解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level 学习了:https://blog.csdn. ...
- 解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题
解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring S ...
- Unknown command '\b'. 关于Mysql导入外部数据库脚本报错的解决
来自网络转载 还是字符集的问题 使用source导入外部sql文件: mysql> source F:\php\bookorama.sql;--------------source F:---- ...
- mysql数据库还原出错ERROR:Unknown command ‘\\’解决手记
使用mysql命令行客户端,使用source导入备份文件,但导入中出错, ERROR: Unknown command ‘\\’. ERROR: Unknown command ‘\”. ERROR: ...
- mysql source 报错 Unknown command '\'' 解决办法
系统:Windows2008 R2 source 导入数据总是报错. ERROR:Unknown command '\''.ERROR:Unknown command '\"'.ERROR ...
- 初学tensorflow遇到的Error——UnrecognizedFlagError: Unknown command line flag 'f'
最近在学习<tensorflow实战>时需要下载cifar10数据集,在cifar10目录下用到命令: import cifar10,cifar10_inputcifar10.maybe_ ...
- MySQL数据库导入错误:ERROR 1064 (42000) 和 ERROR at line xx: Unknown command '\Z'.
使用mysqldump命令导出数据: D:\Program Files\MySQL\MySQL Server 5.6\bin>mysqldump -hlocalhost -uroot -proo ...
- LogStash启动报错:<Redis::CommandError: ERR unknown command 'script'>与batch_count 的 配置
环境条件: 系统版本:centos 6.8 logstash版本:6.3.2 redis版本:2.4 logstash input配置: input { redis { host => &qu ...
随机推荐
- 简单了解RPC实现原理-copy
核心框架类 /* * Copyright 2011 Alibaba.com All right reserved. This software is the * confidential and pr ...
- 第八章 AtomicInteger源码解析
1.原子类 可以实现一些原子操作 基于CAS 下面就以AtomicInteger为例. 2.AtomicInteger 在没有AtomicInteger之前,对于一个Integer的线程安全操作,是需 ...
- Kafka优化提升
一.如何优化kafka集群 1.吞吐量 2.低延时 生产者 a.batch.size=512kb或1MB(批量数据大小) b.buffer.memory=64M(缓冲区大小) c.linger.ms= ...
- Golang-容器3
http://c.biancheng.net/golang/container/ Go语言数组详解 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成.因为数组的长度是固定 ...
- C#定点执行任务测试案例
定时方法实现类 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text ...
- 分布式多级缓存(本地缓存,redis缓存)
结构包: 使用案例: 实现效果: 1.基本并发的本地缓存,基于分布式轻量级锁的redis缓存 2.热缓存(高频访问持续缓存)+快速过期(本地缓存2秒,redis缓存10秒) 3.方法级别缓存清理 (@ ...
- kNN(K- Nearest Neighbor)基本原理
- 【推荐】一款.NET Core开发的开源免费功能完善的医疗影像PACS系统
项目介绍 今天给大家推荐一款开源(MIT License开源协议).免费.完善.轻量级的医疗影像PACS系统,基于.NET Core 的 DICOM SCP(Service Class Provide ...
- TensorFlow2入门与实践--CNN
卷积神经网络CNN CNN原理 关于CNN的原理本文使用代码的方式来直观理解卷积中各个操作过程. 卷积 卷积层是CNN的核心组件,通过可学习的卷积核在输入特征图上进行滑动窗口操作.每个位置上,卷积核与 ...
- 『Python底层原理』--CPython如何编译代码
前一篇我们介绍了CPython VM的运行机制,它基于一系列字节码指令来实现程序逻辑. 不过,Python字节码在完整描述代码功能上存在局限性,于是代码对象应运而生.像模块.函数这类代码块的执行,本质 ...