Mac OS X 10.8.2( "Lion")およびそれ以前のバージョンでこれらのバイナリを実行すると、Mac OS X 10.8.2でGCC 4.7.2( "Mountain Lion")でコンパイルされたバイナリでIllegal Instruction: 4
エラーが発生します。バイナリはMac OS X 10.8.xで正常に機能します。
コンパイルフラグに-mmacosx-version-min=10.5
を追加しました。これは、10.5.x、10.6.x、および10.7.xクライアントの問題の解決に役立つようです。
私の質問に到達します:
Illegal Instruction: 4
エラーとは何ですか?-mmacosx-version-min=10.x
が10.x
以上のクライアントでこの特定のエラーを修正するのはなぜですか?この修正をメイクファイルに適用したいのですが、トリガーを引く前にそれが何をしているのか知りたいです。 (より大きなバイナリがありますか?64ビットバイナリはまだありますか?このアプローチで知っておくべき落とし穴はありますか?意図しない副作用?など)
Apple Developer Forum (アカウントが必要)から:
「コンパイラとリンカーは、古いOSバージョンでは動作しない機能を使用して最適化を実行できます。
-mmacosx-version-min
は、動作する必要のあるOSバージョンをツールに伝えるため、ツールは実行されない最適化を無効にできますこれらのOSバージョンで使用します。古いOSバージョンで実行する必要がある場合は、このフラグを使用する必要があります。「
-mmacosx-version-min
のマイナス面は、新しいOSバージョンではアプリのパフォーマンスが低下する可能性があることです。後方互換性を必要としない場合はそうでした。ほとんどの場合、違いはわずかです。」
「違法な命令」メッセージは、バイナリを実行しようとしているOSのバージョンが理解できない命令がバイナリに含まれていることを示すだけです。 4
の正確な意味を説明することはできませんが、それはAppleの内部にあると思います。
そうでなければこれらを見てみましょう...彼らは少し古いですが、おそらくあなたが知っておくべきことを教えてください
私は古い質問に対するこの回答を意識的に書いています with this を念頭に置いています。他の回答は役に立たなかったからです。
コンパイルしたシステムでバイナリを実行しているときにIllegal Instruction: 4
を取得したため、-mmacosx-version-min
は役に立たなかった。
Mac OS X 10.11のコードブロック16でgccを使用していました。
ただし、最適化のためにコードブロックのコンパイラフラグをすべて無効にしました。そのため、コードブロックセットのすべてのフラグを確認し(プロジェクトを右クリック-> [ビルドプロパティ])、特に最適化のための-s
と-O
flagsを必要としないと確信しているすべてのフラグをオフにします。それは私のためにそれをしました。
問題が不適切であることがわかりましたif (leaf = NULL) {...}
あるべき場所if (leaf == NULL){...}
これらのコンパイラの警告を確認してください!
Xcode 10でビルドしようとすると、このエラーが発生しました。Swiftコンパイラのバグのようです。 Whole Module Optimization
をオンにしてビルドすると、問題が解決します。 https://forums.Swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118
これは理想的な解決策ではありません。この問題が解決するまでXcode 9.4.1を使用し続けます。
私の場合、オーバーロード中にこれを取得しました
ostream & operator << (ostream &out, const MyClass &obj)
out
を返すのを忘れていました。他のシステムではこれは単に警告を生成しますが、macosではエラーも生成します(ただし、正しく印刷されるようです)。
エラーは、正しい戻り値を追加することで解決しました。私の場合、-mmacosx-version-min
フラグを追加しても効果はありませんでした。
最近このエラーが発生しました。バイナリを-O3でコンパイルしました。グーグルは、これは「違法なオペコード」を意味すると言っており、私には怪しいように思えた。その後、すべての最適化をオフにして再実行しました。エラーはセグメンテーション違反に変わりました。したがって、-gを設定してvalgrindを実行することにより、ソースを追跡して修正しました。すべての最適化を再度有効にすると、違法な命令が表示されることはありませんでした4。
明らかに、間違ったコードを最適化すると、奇妙な結果が生じる可能性があります。