2017-06-23 20 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.

アーチとLinuxの Intel Core 2 Duo CPU T8100 これを修正するにはどうすればよいですか?

+5

GCCがあなたのCPUにない命令を使用していたより新しいCPUのコードをコンパイルしましたか? –

+0

スタックを調べると、これを得る最も簡単な方法は、配列など(任意のUB)を実行してリターンアドレスを踏みにじることです。その後、有効な命令を含まないアドレスに戻ります。 –

+0

サンプルコード – Zeldhoron

答えて

5

エラーメッセージは「不正な命令」で、唯一のヒントは__x86_rdrand()です。 Googling rdrandはRDRAND instructionにつながります.Ivy Bridgeプロセッサ用に追加されているようですが、Core 2 Duoはそれほど確かではありません。 (それはこの図のPenrynです:https://en.wikipedia.org/wiki/Template:Intel_processor_roadmap

OK、あなたのCPUはRDRANDを持っていません。つまり、コンパイラは、対象となるものについて間違った情報を持っていなければなりません。 GCCでは、調整するフラグは-marchです。あなたの場合、-march=core2はそれを行う必要があります。 -march=nativeと言っても大丈夫です。コンパイルしているものを正確にターゲットにします。

関連する問題