在Amazon服务器上运行时,在VMWare计算机上编译的程序会因非法指令而崩溃

时间:2015-12-29 15:04:05

标签: c++ gcc compilation g++

我在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。

1 个答案:

答案 0 :(得分:1)

因为我是你,我能够检查你的编译器标志,并在其中找到以下内容:

-march=native

根据this answer

  

如果使用-march,GCC将可以自由生成在指定CPU上运行的指令,但不能生成(通常)架构系列中较早的CPU。

我继续前进并重新编译了没有-march=native的程序,它在亚马逊服务器上顺利运行。我不确定为什么之前有过这样的工作 - 也许是因为你从VirtualBox切换到VMWare,后者将本地VM的处理器功能升级到亚马逊服务器以上,导致-march=native启动生成不兼容的代码。

继续该答案,您可以尝试使用-mtune来安全地优化程序:

  

如果使用-mtune,则编译器将生成适用于其中任何一个的代码,但有利于在您指定的特定CPU上运行速度最快的指令序列。