当前位置: 首页 > news >正文

【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命令查找弹出这个提示的位置:
alt text
显示在common/command.c中。

0x01

修改common/command.c打印一些调试信息,帮助我更进一步确定问题所在位置:
alt text
alt text
alt text
再次运行,发现table_len为0:
alt text

0x02

发现问题:

尝试再次修改代码,追溯table_len变量,发现这个ll_entry_count是一个叫链接器的东西:
alt text

相关代码:

1
alt text
##是表示连接两个字符串,例如:有定义#defined a(x,y) x##y,则a(i,j)最终生成为ij
这里会连接生成_u_boot_list_cmd__start_u_boot_list_cmd__end,然后大小就是这两个的差值,那么这两个变量又是在哪的呢?

2
alt text
这段中的_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
alt text
其中U_BOOT_CMD是所有命令用来注册的宏。
alt text
其中section属性允许开发者把变量或函数放置到自定义的段中。
写好命令相关的代码后用U_BOOT_CMD宏来注册,这样会被统计到对应段中。

调试:

这样我们声明一下这两个符号,尝试看看这个段的地址是怎样的:
alt text
运行结果:
alt text
开始地址和结束地址一样,难道是没匹配上?还是没编译进去?

0x03

查看help命令的代码:
alt text
有的。

再看镜像中是否被编译进去了:
alt text
有的。

那就是没匹配上咯?或者说是链接器有兼容性问题?

使用arm-none-linux-gnueabi-objdump检查段信息:
alt text
alt text
就是说,编译了……

再看u-boot.map
alt text
诶?被_u_boot_list_先匹配去了,后面的_u_boot_list_cmd__u_boot_list_env_clbk_都没分到内容!
咋办?

0x04

通过搜索命令,我们最终可以大致确认原始脚本位置:
alt text

替换一下位置:
alt text
生成后发现没用,经检查发现是u-boot.lst被重新生成了。

0x05

好,上面的u-boot.lst也是生成的,由make_u_boot_list生成:
alt text

函数在helper.mk中,我们让这个函数失效:
alt text

再次修改u-boot.lst后重新编译,刷写到 SD 卡。

0x05

成功了!
alt text
晚安,搞到了凌晨四点,明天还有早八 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

相关文章:

  • 等保十问/等保相关基本问题解答
  • git日志规范
  • FastAPI + Vue3 对 SSE 通知机制的实现与进阶思考
  • Python----概率论与统计(贝叶斯,朴素贝叶斯 )
  • 青少年编程与数学 02-016 Python数据结构与算法 05课题、哈希表
  • 如何在Linux系统Docker部署Dashy并远程访问内网服务界面
  • ROS云课三分钟-差动移动机器人巡逻报告如何撰写-中等报告
  • 使用pip3安装PyTorch与PyG,实现NVIDIA CUDA GPU加速
  • LeetCode Hot100 刷题笔记(1)—— 哈希、双指针、滑动窗口
  • <component>用于挂载切换几个不同的组件
  • mobaxterm连接ssh提示sshpass: command not found
  • vmware、centos: 快照、redis集群克隆、虚拟机克隆后无法上网
  • 最简rnn_lstm模型python源码
  • 京存双活磁盘阵列助力国家交通指挥中心
  • Excel流式多线程带进度条功能的导入框架
  • 当开源邂逅AI,公益长出翅膀 | 回顾3.30 上海「开源×AI 赋能公益」Meetup
  • 如何更改wsl2中的ubuntu默认安装位置
  • 前端Js,检查一个字符串中是否出现高重复率
  • 理解Commit:版本控制的核心概念
  • 模拟的DDoS攻击网络数据样例,包含正常流量与不同类型攻击的对比数据
  • 行业门户网站系统/友情链接有哪些作用
  • 做网站建设的公司/学网络运营在哪里学比较好
  • 公司网站建设设计公司/百度关键词分析工具
  • 专业型企业网站有哪些/推广赚钱软件排行
  • 上海设立企业网站/网站快速排名推荐
  • 高校门户网站建设方案/百度上搜索关键词如何在首页