CentOS6.9 更新binutils

今天在CentOS 6.9的桌面版上编译avx2的 intrinsic 相关程序出现了如下问题:
提示:

/tmp/cclHoR4a.s:27: Error: suffix or operands invalid for `vpunpcklwd'
...

不支持avx2?但是我之前在CentOS7的minimal却是可以的。
这就很奇怪了,理论上gcc 5.3.0 是支持的,处理器也是 i7 的,绝对是能够使用avx2 的。

论坛上逛了几圈,终于找到答案,原来是 binutils的版本太低的缘故。
CentOS 6.9桌面版的版本是:2.20.51.0.2-5.46.el6 20100205 。
版本太低了,而我之前的CentOS 7 minimal上之所以能编译是因为gnu binutils版本为:2.25.1-22.base.el7

对gcc来说,只能将C代码编译为以.s结尾的文本形式的汇编文件,而.s到.o的过程,则需要由as来完成,而as属于gnu binutils软件包。
因此,如果不升级binutils,可能会出现这种情况:
gcc按照新款cpu的特点编译 C代码,生成的.s文件中含有较新的指令,例如avx2指令(新款x86系列cpu的加速指令)。
而老版的as程序却不认识此指令,结果导致编译失败。另外,像objdump反汇编二进制文件时,也同样可能出现某些指令不能识别的问题。

[root@localhost Share]# wget http://ftp.gnu.org/gnu/binutils/binutils-2.25.1.tar.bz2  
//wget如果下载不下来就 直接浏览器访问网址下载后再解压
[root@localhost Share]# tar -xjf binutils-2.25.1.tar.bz2   
[root@localhost Share]# cd binutils-2.25.1  
[root@localhost binutils-2.25.1]# ./configure  --prefix=/usr  
[root@localhost binutils-2.25.1]# make  
[root@localhost binutils-2.25.1]# make install  
//安装完毕验证结果
[root@localhost binutils-2.25.1]# as --version 
GNU assembler (GNU Binutils) 2.25.1  
[root@localhost binutils-2.25.1]# objdump -v  
GNU objdump (GNU Binutils) 2.25.1  
[root@localhost binutils-2.25.1]# ld -v  
GNU ld (GNU Binutils) 2.25.1 

好了,做完上述工作就能够正常编译了。

猜你喜欢

转载自blog.csdn.net/u011334738/article/details/81186345