LZMA ERROR 1 - must RESET board to recover错误分析
来源:互联网 发布:nodejs webshell 编辑:程序博客网 时间:2024/05/12 00:52
因为项目的需要,编译了MTK官方的4.1版SDK,最终生成了manfeel_uImage文件,刷入开发板之后重启,出现了这个LZMA ERROR 1的错误。是我运气太好,还是太背?上次也碰到过这个问题,改动了一下load address(由原来的0x80000000改成了0x80100000),就过了。然而,这次的问题貌似没那么简单。
只好深入uboot的lib_generic/lzmaDecode.c中一探究竟。解压缩lzma数据的函数原型是:
int lzmaBuffToBuffDecompress(char *dest,int *destlen,char *src,int srclen);
看了代码之后,不得不吐槽一下写这个代码的人,为神马任何错误,作者都返回1?是作者太自(Zi)信(Da),还是认为人们不需要了解错误的细节?好,抱怨归抱怨,代码是必须要分析的,加上一些诊断输出代码后,发现了有用的信息:
stream version is not supported, outSize = FFFFFFFF
LZMA ERROR 1 - must RESET board to recover
对照该部分代码分析:
memcpy(properties,src,sizeof(properties));
src += sizeof(properties);
outSize = 0;
for (ii = 0; ii < 4; ii++)
{
unsigned char b;
memcpy(&b,src, sizeof(b));
src += sizeof(b);
outSize += (unsigned int)(b) << (ii * 8);
}
if (outSize == 0xFFFFFFFF)
{
//sprintf(rs + strlen(rs), "\nstream version is not supported");
printf("\nstream version is not supported, outSize = %X\n", outSize);
return 1;
}
for (ii = 0; ii < 4; ii++)
{
unsigned char b;
memcpy(&b,src, sizeof(b));
src += sizeof(b);
if (b != 0)
{
//sprintf(rs + strlen(rs), "\n too long file");
printf("\n too long file");
return 1;
}
}
大概分析了一下lzma的头部信息:
显然,后面的数据大小是有问题的!对比一下OP的一个firmware,就能更加清楚:
初步分析,问题可能出现在lzma压缩上,是否是lzma版本导致的问题?
进入source/vendors/Ralink/MT7620,查看Makefile
发现这个该死的Makefile调用的居然是系统默认的lzma文件,Ubuntu14.04的lzma版本是:
xz (XZ Utils) 5.1.0alpha
liblzma 5.1.0alpha果断修改,将4.32.7版本的lzma拷贝到source目录,修改Makefile如下:
#manfeel, do NOT use the system default lzma(5.1.0alpha), just use the 4.32.7image: mkimage$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S $(ROOTDIR)/$(LINUXDIR)/vmlinux $(KERNELZ)cd $(IMAGEDIR) ; rm -f $(KERNELZ).*; ../$(COMP) -v -9 -f -S .$(COMP) $(KERNELZ)
打完收工,一桩悬案终于水落石出… …
- LZMA ERROR 1 - must RESET board to recover错误分析
- LZMA ERROR 1 - must RESET board to recover错误分析
- 解决MT7620不断循环uboot(LZMA ERROR 1 - must RESET board to recover)
- MySQL5.7 错误:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before ...
- Connection reset by peer: socket write error错误分析
- Connection reset by peer: socket write error错误分析
- Connection reset by peer: socket write error错误分析:
- Connection reset by peer: socket write error错误分析
- Connection reset by peer: socket write error错误分析
- 错误mac mysql error You must reset your password using ALTER USER statement before executing this stat
- Connection reset by peer: socket write error错误分析及解决
- Connection reset by peer: socket write error错误分析及解决
- Connection reset by peer: socket write error错误分析及解决
- Connection reset by peer: socket write error错误分析及解决
- Connection reset by peer: socket write error错误分析及解决 .
- React Native报Super expression error must either be null or a function错误分析
- Attempt to reset the display driver and recover from timeout failed
- RHEL7 recover/reset root password
- java 字符串替换处理方法
- Google搜索技巧
- 对于一个数字,我们可以直观的了解到它所含有的数字,例如: 3243中包含1个2、2个3、1个4。 那么,给你一个数n,求从1到n之间的所有这些数字中,总共包含多少个m。
- Android: 文件操作大全
- Google高级搜索技巧十则
- LZMA ERROR 1 - must RESET board to recover错误分析
- 竖式问题
- 求二叉树中节点的最大距离
- Shortest Prefixes
- iOS 证书详解(二)
- javascript学习笔记(四) Number 数字类型
- SPOJ NITK06 16121 MODIFY SEQUENCE
- 最常用的CURL命令大全
- Xcode在调试时查看到变量都是nil的问题