我在Ubuntu 14.04.3上编译程序。然后我将其复制到运行Ubuntu 14.04.2的Amazon AWS服务器。然而,它立即与非法指令(它在源计算机上工作)崩溃,并带有来自gdb
的以下堆栈跟踪:
Program received signal SIGILL, Illegal instruction.
...
(gdb) bt
#0 0x000000000093716b in std::vector<int, std::allocator<int> >::_M_fill_insert(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, unsigned long, int const&) ()
#1 0x0000000000706581 in _GLOBAL__sub_I__ZN5abcdf6kfjg446zcadetERKSs ()
#2 0x0000000000b2abad in __libc_csu_init ()
#3 0x00007ffff7106e55 in __libc_start_main (main=0x6fa390 <main>, argc=2, argv=0x7fffffffe668,
init=0xb2ab60 <__libc_csu_init>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe658)
at libc-start.c:246
#4 0x0000000000708437 in _start ()
是什么给出的?它们似乎正在使用相同版本的libc。
答案 0 :(得分:1)
因为我是你,我能够检查你的编译器标志,并在其中找到以下内容:
-march=native
根据this answer:
如果使用
-march
,GCC将可以自由生成在指定CPU上运行的指令,但不能生成(通常)架构系列中较早的CPU。
我继续前进并重新编译了没有-march=native
的程序,它在亚马逊服务器上顺利运行。我不确定为什么之前有过这样的工作 - 也许是因为你从VirtualBox切换到VMWare,后者将本地VM的处理器功能升级到亚马逊服务器以上,导致-march=native
启动生成不兼容的代码。
继续该答案,您可以尝试使用-mtune
来安全地优化程序:
如果使用
-mtune
,则编译器将生成适用于其中任何一个的代码,但有利于在您指定的特定CPU上运行速度最快的指令序列。