【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的编译、镜像制作和刷写更加熟练了。

晚安~ ( 早安!感谢豆包~ )

叁、参考

  1. https://www.doubao.com/thread/w4ea6b9d8ece3d7e9
  2. https://www.doubao.com/thread/w16f419b17f0e9afe
  3. https://www.doubao.com/thread/w2cd5264f38dd2ff8
  4. https://www.doubao.com/thread/w2cd5264f38dd2ff8
  5. https://www.doubao.com/thread/w2cd5264f38dd2ff8
  6. https://www.doubao.com/thread/wef34dbca2d2d6605
  7. https://www.doubao.com/thread/w7eec8793d6766c13

【U-Boot】解决U-Boot的“Unknown command 'help' - try 'help'”问题的更多相关文章

  1. 如何解决spring boot 项目导入依赖后代码报错问题

    如何解决spring boot 项目导入依赖后代码报错问题 2020-08-15  14:17:18 代码截图如图所示(由于本人问题已经解决,没来得及截图,所以在网上找了一张图片)

  2. spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500:no convertter for return value of type

    问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json ...

  3. 解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level

    解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level 学习了:https://blog.csdn. ...

  4. 解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题

    解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring S ...

  5. Unknown command '\b'. 关于Mysql导入外部数据库脚本报错的解决

    来自网络转载 还是字符集的问题 使用source导入外部sql文件: mysql> source F:\php\bookorama.sql;--------------source F:---- ...

  6. mysql数据库还原出错ERROR:Unknown command ‘\\’解决手记

    使用mysql命令行客户端,使用source导入备份文件,但导入中出错, ERROR: Unknown command ‘\\’. ERROR: Unknown command ‘\”. ERROR: ...

  7. mysql source 报错 Unknown command '\'' 解决办法

    系统:Windows2008 R2 source 导入数据总是报错. ERROR:Unknown command '\''.ERROR:Unknown command '\"'.ERROR ...

  8. 初学tensorflow遇到的Error——UnrecognizedFlagError: Unknown command line flag 'f'

    最近在学习<tensorflow实战>时需要下载cifar10数据集,在cifar10目录下用到命令: import cifar10,cifar10_inputcifar10.maybe_ ...

  9. 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 ...

  10. 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 ...

随机推荐

  1. Java之线程本地变量ThreadLocal-copy

    基本概念和用法 线程本地变量是说,每个线程都有同一个变量的独有拷贝,这个概念听上去比较难以理解,我们先直接来看类TheadLocal的用法. ThreadLocal是一个泛型类,接受一个类型参数T,它 ...

  2. w3cschool-微信小程序开发文档-组件

    https://www.w3cschool.cn/weixinapp/sp6z1q8q.html 微信小程序视图容器 view view 视图容器. 属性 类型 默认值 必填 说明 最低版本 hove ...

  3. 解决StringBuilder readline阻塞问题

    readline之所以会阻塞socket流没有结束符 阻塞场景:read() 没有读取到任何数据 readLine() 没有读取到结束符或者换行符 可以用ready判断通道中数据是否读完,读完返回fa ...

  4. 最大流的 Dinic 算法和 ISAP 算法

    上期回顾:https://www.cnblogs.com/ofnoname/p/18678895 之前我们已经介绍了最大流问题的基本定义.最大流最小割定理.增广路径与残量网络的构建方法,以及如何利用这 ...

  5. 安全可信 | 天翼云自研密钥管理系统(KMS)获得《商用密码产品认证证书》!

    近日,天翼云自研密钥管理系统(KMS)通过国家密码管理局安全性审查,符合GM/T 0051<密码设备管理 对称密钥管理技术规范>要求,获得由国家密码管理局商用密码检测中心颁发的<商用 ...

  6. SqlServer中使用游标遍历数据集合

    具体代码如下所示: /***************************************** 实例:打印输出数据表BUS_Test中的Name和Age字段的值 ************** ...

  7. 【1】JobManager启动

    一.Flink底层通信技术 Akka + Netty Akka:它是基于协程的,基于scala的偏函数 Netty:相比更加基础一点,可以为不同的应用层通信协议(RPC,FTP,HTTP等)提供支持 ...

  8. 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)

    在人工智能飞速发展的今天,大语言模型的应用越来越广泛.DeepSeek 作为近期爆火的一款大语言模型,受到了众多开发者的青睐. 今天这篇内容,就来聊聊,如何在本地自己的电脑上部署DeepSeek. 1 ...

  9. npm i 下载太慢

    1.在项目内部进入终端 2.输入:npm config set registry https://registry.npmmirror.com 修改npm下载地址为淘宝 3.然后再执行 npm i 进 ...

  10. CDH - [01] 概述

    一.什么是CDH   CDH是Cloudera's Distribution Including Apache Hadoop的缩写,即Cloudera公司发布的Hadoop发行版.它是一个为Hadoo ...