0x01 前言:   同一个程序在一台高版本Linux上运行时没有问题,而在另一台低版本机器上运行报Floating Point Exception时,那么这极有可能是由高版本gcc链接造成的。高版本的gcc在链接时采用了新的哈希技术来提高动态链接的速度,这在低版本中是不支持的。因此会发生这个错误。gcc就是一个编译器。编译出来的软件在低版本操作系统上有些技术不支持造成这个原因。   什么意思呢?就是用高版本GCC编译的程序在低版本GCC库环境下是无法运行的。当然了反过来讲也是对的,就是不同主版本的GCC编译出来的环境和程序是存在兼容性问题的。0x02 分析:   --- SIGFPE (Floating point exception) @ 0 (0) ---   通过相同的命令发现,虽然输出的提示稍有差异,但是都指向了/lib64/libdl.so.2这个文件。kernel: [60795.243107] mysql[3127] trap divide error
ip:7fea7d9b065f sp:7fff6bc3f2a0 error:0 in ld-2.4.so[7fea7d9a8000+1b000]
 rpm -qf /usr/lib64/libstdc++.so.6
libstdc++-4.1.2_20070115-0.11
root@xxx:~# rpm -V libstdc++-4.1.2_20070115-0.11
.......T    /usr/lib/libstdc++.so.6.0.8
....L...    /usr/lib64/libstdc++.so.6
.......T    /usr/lib64/libstdc++.so.6.0.8
/usr/lib64/libstdc++.so.6被链接到了
 /usr/lib64/libstdc++.so.6.0.13,在相同版本的系统下,对应的软链接也是到
/usr/lib64/libstdc++.so.6.0.8,说明这个链接地址被修改过了。
  cd /usr/lib64ln -sf libstdc++.so.6.0.8 libstdc++.so.6 
   根据文章中的描述,进行完这一步操作,之前异常的程序就正常运行了,可是我一运行,还是报错。  file /usr/lib64/libstdc++.so.6.0.8   哎,肯定是有人安装软件时用32位的库文件覆盖了/usr/lib64/libstdc++.so.6.0.8的同时修改了目标软链接。0x03 结论: 0x04 总结:   python版本的替换,不要直接覆盖,最好用软链接或者指定绝对路径的方式来替换。系统中有很多系统是由python写的,一旦替换的python版本与系统版本差异较大,就会导致系统依赖python的程序无法正常运行,比如yum。   修改配置文件。修改之前做个备份,有的时候真得能救一命。   删除先mv bak,直接删除的后果有时可能会很严重。   多人修改,一个机器使用的人越多,引发故障的可能性越大,重要的信息还是要有备份或者容灾。 0x05 附录