问题描述
1、 调用了别人编译的第三方库so,集成到自己的程序中编译没有任何问题,运行程序会报错illegal instruction,并产生core文件。
2、 在一台机器上编译好的可执行文件,放到相同架构相同系统的机器上跑会报illegal instruction错误
ERROR: Illegal instruction (core dumped)
所谓 Illegal instruction (错误指令),表示处理器(CPU)收到了一条它不支持的指令
大多数情况下,是因为程序采用了特定的优化编译,需要依赖一定(新型)的CPU指令集。例如,一些近期的tensorflow构建都是假设你的CPU支持 AVX 指令,而对于早于2011年的处理器或者低端x86 CPU(Pentium, Celeron, Atom)都不支持AVX指令集。
原因分析:
保证在本身程序没有错误的前提下,在编译的时候用了优化指令,使用了-march=native对三方库做优化。把这个优化选项去掉之后,程序就能正常运行了。这个指令的具体作用如下:
-march=native 是一个 GCC 和 Clang 编译器的命令行选项,用于指导编译器为当前机器的具体型号生成优化后的代码。
作用:
指定目标架构:编译器会检测运行编译命令的机器的 CPU 类型,并使用适用于该 CPU 的优化选项。
启用特定指令集:例如,如果您在支持 AVX2 的机器上使用 -march=native,那么编译器会允许生成使用 AVX2 指令的代码。
优点:
性能优化:为特定的 CPU 生成的代码可以更好地利用该 CPU 的特性和指令集,从而可能带来性能上的提升。
自动化:不需要手动指定目标架构或其他相关的标志。编译器会自动探测并决定最佳选项。
缺点:
不可移植性:使用 -march=native 编译出的程序可能在与编译它的机器具有不同 CPU 的机器上无法运行,或者性能下降。这是因为生成的代码可能依赖于某些只存在于特定 CPU 上的指令。
兼容性问题:如果您编译的程序需要在多种硬件平台上运行,使用 -march=native 可能不是一个好主意。因为它可能生成仅针对某一特定硬件优化的代码,而不是一种更为普遍、兼容的代码形式。
预期之外的效果:在某些情况下,尽管理论上 -march=native 应该提供最佳性能,但由于各种原因(例如,CPU 的微体系结构、缓存大小等),可能不会看到明显的性能提升,或者性能甚至可能会下降。
总的来说,使用 -march=native 可能会为特定的机器带来性能上的优势,但可能会牺牲掉代码的可移植性。在决定是否使用此选项时,建议进行性能测试并仔细考虑目标平台。
解决方案:
去掉 -march=native