Illegal Instruction: 4
・・・なんですかそれは。
Mojaveにアップグレードしてから環境を整えるべく作業しているのですが、
Homebrewでffmpegをインストールして使おうと思ったらエラーが出て止まりました。
困ったことに、違うアーキテクチャを使用している場合に出るエラーだそうです。
簡単に言うと「使える環境じゃないよ」と。
でも使いたいじゃないですか。
諦めなければ道はひらけ・・・る?(ひらけます)
問題が生じる環境について
今回の記事はちょっと特殊な使い方をしているMacでのトラブルシューティングです。
恐らく普通に使っている場合は関係ないかと。
というのも、
サポート外のMacにパッチツール(Mojave Patcher)でOSをインストールしている場合に、
ネイティブでサポートしているMacとの差異によって引き起こされたエラー
だからです。
故にパッチツールでインストールしたからといって必ず起こるわけではありません。
単に古いiMacを使っている弊害という感じでしょうか。
門外漢なので細かいところまでは説明できませんが、
大まかに言うと「カーネルが許していない命令を実行しようとしたことを示すエラー。通常少し異なるマシンアーキテクチャー用にコンパイルされたプログラムを実行すると発生する。」らしいです。
つまり理解できない(より新しい方のCPUで搭載された)命令を実行したからエラーが返された、というわけ。
そしてそれはffmpeg以外でも起こる可能性が多分にあるということです。
うん困った。
ffmpegをビルドし直してインストールする
ではどうするか。
動作するものをビルドし直すしかない。
$ brew install ffmpeg
と打っては、普通にMojaveネイティブで動くものがダウンロード&インストールされてしまいます。
そこで
–build-from-source
オプションを付けてソースからビルドします。
その前にやっておくことが二つほど。
hardware.rbを書き換える
下記のファイルをテキストエディタなどで開きます。
/usr/local/Homebrew/Library/Homebrew/extend/os/mac/hardware.rb
そして後半部分を
elsif version >= :mojave #:nehalem ← 削除してもOK :core2 else generic_oldest_cpu end
のように書き換えます。
:nehalem の行を#でコメントアウトしてますが、削除しても構いません。
要するにmojave以降であれば :nehalem
というのを :core2
に変更するということ。
core2というのはNehalemの前身だそうです。
Nehalemマイクロアーキテクチャ(ネハレム【ネヘイレム、ネヘーレム等】マイクロアーキテクチャ、単にNehalem [英語発音: [nəˈheɪləm][1]] とも)は、インテルが開発した、Coreマイクロアーキテクチャの後継となるマイクロプロセッサ (CPU) のマイクロアーキテクチャである。
(Nehalemマイクロアーキテクチャ – wikiより)
ちなみにすぐ下にある「generic_oldest_cpu」のように書いても同じ結果が得られます。
インテルか64bitかなどで振り分けているようですね。
※該当部分のコード alias generic_oldest_cpu oldest_cpu
#部分抜粋 def oldest_cpu(_version = nil) if Hardware::CPU.intel? if Hardware::CPU.is_64_bit? :core2 else :core end elsif
High Sierraの中にあるファイルも見てみたら全く同じ記述でした。
つまり core2 で処理されていたことになります。
それなら問題なく動くはず。
/etc/hostsファイルに追記
書き換えなくても –build-from-source オプションをつけるだけでうまくいくかもしれません。ただし依存関係はすでにビルドされているバージョンがDL&インストールされます。
/etc/hosts
を開き、
0.0.0.0 homebrew.bintray.com
を追記します。
これは一時的にサーバー(homebrew.bintray.com)へ接続できない形にして、
ソースを ftp.gnu.org からダウンロード、ビルドさせます。
これで準備完了。
ffmpegを再インストールする
ここまで出来たらターミナルを開き、
再インストールの場合は reinstall、そうでないなら install とし、
brew reinstall ffmpeg --build-from-source
を入力。
えらく時間がかかりますが、辛抱強く待ちましょう。
15分くらいかかったかな?
(当然環境によって変わります)
終われば今回の作業は完了です。
まとめ
これでエラーは出なくなりました。
よかった(安堵
今回はffmpegでエラーが出たのでこのような対処になりましたが、
必ずしもすべてのプログラム、ツールにおいて使えなくなると言うことではありません。
あくまでも古いcpuが理解できないコードが書かれている場合にそうなるのかと。
なので普段は普通に brew install しておいて、問題が発生し、かつそれがハードの古さからくるものらしければソースからのビルドを試してみたらいいかな。
然は然りながらアップデートなど、パッケージの管理を簡単にできるのがHomebrewの強み。
今後のアップデートに関しては毎回ビルドし直すことになるわけで・・・ちょいと面倒。
とは言えソースを引っ張ってくる手間などもないので楽といえば楽なんだと思いますが。
あと -mmacosx-version-min=10.x というオプションを付けてビルドするという情報も見つけたのですが、今はオプションを受け付けない形になったらしくその方法は使えませんでした。その辺はよくわからず。
なんかやっぱりちょっと面倒くさいなぁ、というのがMojaveの印象。
High Sierraではこんなこと気にせず使っていられたのにね。
文句言っても仕方ないですけど。
とりあえず以上です。
これが何かの参考になれば。
追記:mp4関連について
その後拡張子だけ指定してのエンコードで同じエラーが出ました。
tsファイルをmp4に変換しようとして(h264へとエンコードしようとした結果)、依存関係にあるライブラリで引っかかって「Illegal Instruction: 4」になった模様。
そのあたりもインストールし直さなければやっぱりエラーが出てしまう感じですね。
ひとまず x264 を上記と同じく再インストールしたらエンコードできるようになりました。
$ brew reinstall --build-from-source x264
コメント