|
发表于 2019-10-27 12:07:52
|
显示全部楼层
尾部的菜单格式上,没发现错误。至于说菜单之前的那些程序代码以及数据,那就要给编译器烧香了。只要编译器没错,那就没错。有一些是 ASM 代码,那应该没有问题。也有很多代码,是没能用 ASM 来实现,依旧保持 C 代码,那就会受到 gcc 的影响了。说实在话,gcc 不可靠,我对它的开发者,也存在某些不信任。在没有合适的替代品之前,只好继续使用 gcc。本来指望华为能够出个可靠的操作系统以及可靠的编译器,可惜,从现有信息来看,这事很没谱,八成是虚构的,靠不住。得知华为的编译器是以 gcc 为基础,也就失望了。如果能以别的编译器(比如 clang)为基础,(在我看来)尚有希望。本人对启动引导软件开发没兴趣了,因此,本人也就不关心这些工作了。否则的话,我可能会尝试用 clang 来编译 grub4dos 或编译 wee。
在 wee63.mbr 的偏移 046C 处,有个整数(在你的编译之下,它是 F618),它指示了尾部 B0 02 1A CE 这个“bootlace 签名”的位置。你的签名实际上起始于 7818 处。两者的差值,应该是一个恒定的常数。也就是说,F618 - 7818 = 常数(屏蔽掉高位,只留下低 16 位的数值),这个常数是 7E00。你试试看,不同的编译,它们的差值是不是都是恒定的 7E00?
尾部的 B0 02 1A CE,正如前面所说,它应该位于 4 字节对齐的边界处。它后面紧跟 12 个 00 字节。然后紧接着就是菜单内容了。从 B0 02 1A CE 开始,不是由 gcc 生成的,而是由 shell 写入的。如果 shell 不是 bash,就有可能写入多余的垃圾字节,造成错误。 |
|