Homebrewで入れたffmpegがエラー!Illegal Instructionで動かない【Mojave patcher】

コンピュータ関連
スポンサーリンク

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

不可視ファイルはFinderからの場合「cmd + shift + .(ドット)」で表示できます。

そして後半部分を

    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

参考URL

macOS 10.14 Mojave on Unsupported Macs Thread

コメント

タイトルとURLをコピーしました