龙芯爱好者的日常!
返回

简单分析华为的ExaGear和ElTechs公司的ExaGear是不是一个东西

2020-10-05 华为 exagear ElTechs exgear 二进制翻译 2121 2

华为于2020/09/29发布了“自研”的名为ExaGear的动态二进制指令翻译工具,与俄罗斯ElTechs公司于2012年开始开发,2014年首次发布的ExaGear有完全相同的名字,功能也非常类似,因此我认为它们就是同一个东西。

ElTechs公司的ExaGear运行于Android,在ARM CPU上二制翻译x86指令集,运行一个Linux环境,然后用wine运行x86/Windows游戏。

华为发布的ExaGear运行于Linux,在ARM CPU上二制翻译x86指令集,运行一个Linux环境,暂时只能运行x86/Linux程序,尚未提供wine环境运行Windows程序。

简单分析华为的ExaGear和ElTechs公司的ExaGear是不是一个东西

先说说我对华为和ElTechs的ExaGear的对比结果,基本上确认了两者同源,单从功能上看,华为“自研”的版本还退步了。从Android环境回归到Linux之后,暂时失去了运行Windows程序的能力。

本来没有必要做什么对比,华为说是“自研”就是自研吧,人家本来就那么艰难了,何必要拆穿呢!我并不想针对华为,但是最近一些国产ARM CPU粉丝造谣生事、胡搅蛮缠、厚颜无耻得令人愤怒,我只希望此文能让他们冷静冷静。一些人为了证明非ARM系的国产CPU企业无能,而极力否认华为的ExaGear与ElTechs的关系,声称华为没有收购ElTechs的技术,而是在短短时间完成“自研”。我想,如果华为没有收购,那么难道ExaGear是剽窃来的?

言归正传,首先解释一下对比的方式。由于我对ARM指令集不熟悉,如果反编译看汇编代码,就太困难了。但是仅仅对二进制文件进行对比的话,即使同款编译器在不同参数下,对相同的代码编译结果也不会完全相同。还有编译器对代码顺序的调整,会使顺序的文件对比更加困难。因此我想了一个取巧的办法,就是提取二进制文件中的字符串,仅对字符串的内容进行对比。二进制文件中的字符串,除了程序界面使用,大多数是程序员编写的在运行时输出的调试信息,不同的程序员写的调试信息绝对不会相同,就像不同的人不可能写出一字不差的文章一样。如果两个程序中出现了大量相同的字符串,那么就能证明两者的代码是同一来源。

ElTechs公司的ExaGear是Android程序,我下载的是一个apk文件。在apk的lib\armeabi-v7a文件夹下,最大的两个文件分别是libubt.so和libubt2g.so。

简单分析华为的ExaGear和ElTechs公司的ExaGear是不是一个东西

华为的ExaGear运行于Linux,下载后发现是在压缩文件中有许多个rpm安装包,解压缩之后,首先在ExaGear_V100R002C00\CentOS\release\下找到exagear-core-x32a64-1169-1.aarch64.rpm,对它解包后在 opt\exagear\bin 文件下有两个与 ElTechs 名称和大小类似的文件,文件名分别为 ubt_x32a64_al 和 ubt_x32a64_opt 。

下图是对照:

简单分析华为的ExaGear和ElTechs公司的ExaGear是不是一个东西

之后我在linux系统中用readelf命令取出文件中的字符串,保存到文本文件。因为我发现ElTechs的两个文件中,字符串大多是重复的,华为的两个文件也是相同情况,那么就只需要选择 ElTechs 和华为的各一个文件进行对比就可以了。从ELF格式的二进制文件中提取字符串的命令行如下:

先是ElTech的,把提取的字符串保存到 libubt.so.txt 文件。

readelf -p .rodata libubt.so > libubt.so.txt

然后是华为的,把提取的字符串保存到 ubt_x32a64_al.txt 文件。

readelf -p .rodata ubt_x32a64_al > ubt_x32a64_al.txt

使用文本文件编辑工具打开简单对比了一下,确认了相同的字符串有许多,但由于字符串顺序不同,到底是多少字符串是相同的,我还需要写个程序详细统计。为了程序简单,我对比字符串时只比较完全相同的字符串,只要两个字符串中有任何一个字符不同,包括大小写不同或空格数不一样等,我都不列入统计。

下图是两个文件在文本编辑工具中打开的样子,前面是编号,后面是字符串,可见ElTechs和华为的二进制文件中有大量相同的字符串,也有一些字符串有轻微改变。每行字符串前面有12个字符是编号及空格,写程序对比字符串时我会跳过这12个字符。

简单分析华为的ExaGear和ElTechs公司的ExaGear是不是一个东西

下图左边是代码,右边是比较的结果。可以看到,ElTechs的二进制文件 libubt.so 和华为的二进制文件 ubt_x32a64_al 中,完全相同的字符串有 5722 条。做过反汇编的朋友都知道,从二进制文件中取出的字符串,经常一大半都是乱码,且不同的文件乱得不同。libubt.so 这个文件中的字符串总数只有10603条,如果去掉一半的乱码,那么就等于说 libubt.so 中的所有字符串,在华为的 ubt_x32a64_al 中基本上都是存在的。那么,现在可以证明华为的 ExaGear 和 ElTechs 的 ExaGear 是用相同来源的代码编译的了吗?

简单分析华为的ExaGear和ElTechs公司的ExaGear是不是一个东西

在自身缺少积累时,通过技术收购达成补全短板的目的,无论从哪方面来看都是正确的。如果能完全把买来的技术摸清学透,再能持续改进,那就更加优秀。但是,宣传文案对技术来源只字不提,反而强调“自研”,这就是欺骗。当年某版麒麟也是宣传“自研”,后来某版浏览器也是宣传“自研”,结果证实都是欺骗。幸好这还只是一个软件,虽然移植后功能退化,但总归是个小软件,是不是真正自研无伤大雅。如果华为自研的鲲鹏CPU也是这个路数,那就是滑天下之大稽了。

很抱歉,我只是想让某些四处造谣、张狂挑衅的人收敛收敛。


声明:本文中的所有文字及图片,都可以随意转载、修改、或者作为其它文章的素材。本人不保留任何权利。


网友点评
  • weilinfox:向大佬学习!
    回复
  • 匿名用户:有理有据,值得点赞
    回复
顶部