気ままに気ままのエンジニアブログ

定期的に得た知見を気ままに発信中

【Rails/環境構築(M1)】ローカルサーバ起動後にアクセスすると「dyld: lazy symbol binding failed: Symbol not found」エラーが発生し、サーバが落ちる時の対処方法

こんにちは。

天気がよくて気分が良い!花粉がなければ。。

どうもハチマキです。

はじめに

最近MacBook Air(M1,2020)を購入したため、開発環境の構築を行いました。その時に発生したエラーの対処方法についてです。

今回のエラーは結構強敵で、エラー解消に数日費やしました。。そのため、解消方法について書いていきたいと思います。

環境

やりたいこと

サーバを正常に動かしたい

問題

ローカルサーバ起動後にアクセスすると「dyld: lazy symbol binding failed: Symbol not found」エラーが発生し、サーバが落ちる。。

原因

今回の原因は、環境構築時に発生した (ExecJS::RuntimeUnavailable)を解消するためにインストールしたmini_racerが原因でサーバが落ちていました。

エラーログ
% rails s            
=> Booting Puma
=> Rails 5.2.4.5 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.6 (ruby 2.6.4-p104), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
I, [2021-02-13T22:36:34.461153 #83088]  INFO -- : Started GET "/" for ::1 at 2021-02-13 
・
・
dyld: lazy symbol binding failed: Symbol not found: __ZN2v82V813InitializeICUEPKc
  Referenced from: /Users/ユーザ名/development_of_app//vendor/bundle/ruby/2.6.0/gems/mini_racer-0.3.1/lib/mini_racer_extension.bundle
  Expected in: flat namespace

dyld: Symbol not found: __ZN2v82V813InitializeICUEPKc
  Referenced from: /Users/ユーザ名/development_of_app/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.3.1/lib/mini_racer_extension.bundle
  Expected in: flat namespace

zsh: abort      rails s

解消方法

早速ですが、解決方法です。
インストールしたmini_racersをアンインストールし、その状態でbundle installするとExecJS::RuntimeUnavailableエラーが発生するので、 代わりのjs実行エンジンをインストールする必要があります。

ステップ1:インストールしたmini_racerを元に戻す

Gemfileファイル

#gem 'mini_racer', platforms: :ruby #コメントアウトを戻す
ステップ2:libv8をインストールする(環境に応じて必要なv8を提供してくれる)
 %  gem install libv8 -v '3.16.14.19' -- --with-system-v8
Building native extensions with: '--with-system-v8'
This could take a while...
Successfully installed libv8-3.16.14.19
Parsing documentation for libv8-3.16.14.19
Installing ri documentation for libv8-3.16.14.19
Done installing documentation for libv8 after 0 seconds
1 gem installed
ステップ3:v8をbundlerが読むように設定する
$ bundle config build.libv8 --with-system-v8
ステップ4:v8をインストールする(jsの実行エンジン)
% brew install v8
==> Downloading https://homebrew.bintray.com/bottles/v8-8.8.278.15.arm64_big_sur.bottle.tar
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/70e65168b14df8f2e40598467ae15c50
######################################################################## 100.0%
==> Pouring v8-8.8.278.15.arm64_big_sur.bottle.tar.gz
🍺  /opt/homebrew/Cellar/v8/8.8.278.15: 80 files, 39.9MB
Removing: /Users/ユーザ名/Library/Caches/Homebrew/v8--8.8.278.14.arm64_big_sur.bottle.tar.gz... (12.6MB)

ここまでたどり着くのが長かった。。

最後にbundle installしてからサーバを起動したところ、正常にサーバが起動しました。
お疲れ様でした。