2017-06-23 50 views
0

當我編譯此代碼:GCC非法指令

#include <random> 
#include <iostream> 

int main(int argc, char** argv) 
{ 
    std::random_device dev; 
    std::mt19937 mt(dev()); 
    std::cout << mt() << std::endl; 
    return 0; 
} 

,然後嘗試用gdb運行生成的可執行文件我得到這個錯誤:

Program received signal SIGILL , Illegal instruction. std::(anonymous namespace)::__x86_rdrand() at /build/gcc/src/gcc/libstdc++-v3/src/c++11/random.cc:69 69 /build/gcc/src/gcc/libstdc++-v3/src/c++11/random.cc: No such file or directory.

我用Arch Linux的英特爾酷睿2雙核CPU T8100。 我該如何解決這個問題?

+5

你是否曾經編譯過比你有更高CPU的代碼?GCC使用了你的CPU沒有的一些指令? –

+0

檢查堆棧,得到這個(非法指令)的最簡單方法是通過運行一個數組或類似的(任何UB)來對一個返回地址進行踐踏。然後返回到一個不包含有效指令的地址。 –

+0

添加了示例代碼 – Zeldhoron

回答

5

錯誤消息是「非法指令」,唯一的提示是__x86_rdrand()。谷歌搜索引擎導致RDRAND instruction,似乎已被添加到常春藤橋處理器,你的Core 2 Duo當然不是。 (這是這張圖上的Penryn:https://en.wikipedia.org/wiki/Template:Intel_processor_roadmap

好的,所以你的CPU沒有RDRAND。這意味着編譯器必須有關於它的目標是什麼的錯誤信息。有了GCC,要調整的標誌是-march。在你的情況下,-march=core2應該這樣做。也可以說-march=native,它將確切地針對你正在編譯的內容。