我正在编写一个程序来使用库FGB计算 Groebner 基。虽然它有一个 C 接口,但我在 Ubuntu 上从用 g++ 编译的 C++ 代码调用该库。
使用选项-g编译,在gdb中使用x/i $pc,非法指令如下。
0x421c39 FGb_xmalloc_spec+985: vcvtsi2sd %rbx,%xmm0,%xmm0
上面的行在 FGB_xmalloc_spec+985 周围有尖括号。据我所知,我的处理器不支持这条指令,我正试图找出程序使用它的原因。在我看来,该指令来自库代码。但是,我正在编译的代码曾经在桌面上工作,现在它失败了——有一天刚刚开始抛出非法指令。我以为我搞砸了一些库或其他东西,所以我重新安装了 Ubuntu 16.04,但我继续收到非法指令。相同的代码确实适用于另一个桌面和 chromebook,分别运行 Ubuntu 16.04 和 14.04。
技术信息:
- g++:5.4.0 20160609
- gdb:7.11.1
- Ubuntu:16.04/14.04 LTS
进程:x86info 输出
找到 4 个相同的 CPU 扩展系列:0 扩展型号:1 系列:6 型号:23 步进:10 类型:0(原始 OEM) CPU 型号(x86info 的最佳猜测):Core 2 Duo 处理器名称字符串(BIOS 编程):Intel(R ) Core(TM)2 四核 CPU Q9650 @ 3.00GHz
处理器标志
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl pdscmx sstmx cstpr6 sse4_1 xsave lahf_lm tpr_shadow vnmi flexpriority dtherm
编译行
g++ -std=c++11 -g -I src -o bin/main.o -c src/main.cpp
g++ -std=c++11 -g -I src -o bin/Polynomial.o -c src/Polynomial.cpp
g++ -std=c++11 -g -I src -o bin/Util.o -c src/Util.cpp
g++ -std=c++11 -g -I src -o bin/Solve.o -c src/Solve.cpp
g++ -std=c++11 -g -o bin/StartUp bin/main.o bin/Util.o bin/Polynomial.o bin/Solve.o -Llib -lfgb -lfgbexp -lgb -lgbexp -lminpoly -lminpolyvgf - lgmp -lm -fopenmp
在这一点上,我不确定我还能做些什么来避免这种非法指令,并欢迎任何和所有建议。