AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

M1 mac で rbenv install 3.1.2 が失敗して ld: library not found for -lcapstone

主に 3.1.0, 3.1.1, 3.1.2 あたりだけども。

※追記:記事の最後に capstone がどこからきたのか、を追記しました。 結論からいうと環境によっては Ruby 3.1.2 など capstone で問題が起きるバージョンは諦めてコンテナとかで動かしましょう。

M1 mac で rbenv install 3.1.2 をするとコケる

こうなる。

❯ rbenv install 3.1.2
To follow progress, use 'tail -f /var/folders/np/w6ml9cp529j92kms59xq43lr0000gn/T/ruby-build.20230202173652.73375.log' or pass --verbose
Downloading openssl-3.0.7.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/83049d042a260e696f62406ac5c08bf706fd84383f945cf21bd61e9ed95c396e
Installing openssl-3.0.7...
Installed openssl-3.0.7 to /Users/donbulinux/.anyenv/envs/rbenv/versions/3.1.2

Downloading ruby-3.1.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.2.tar.gz
Installing ruby-3.1.2...
ruby-build: using readline from homebrew
ruby-build: using gmp from homebrew

BUILD FAILED (macOS 13.1 using ruby-build 20230202)

Inspect or clean up the working tree at /var/folders/np/w6ml9cp529j92kms59xq43lr0000gn/T/ruby-build.20230202173652.73375.JiWKux
Results logged to /var/folders/np/w6ml9cp529j92kms59xq43lr0000gn/T/ruby-build.20230202173652.73375.log

Last 10 log lines:
transdb.h updated
linking shared-library libruby.3.1.dylib
ld: library not found for -lcapstone
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libruby.3.1.dylib] Error 1
make: *** Waiting for unfinished jobs....
transform_mjit_header: making external definition static inline: rb_vm_lvar_exposed, Init_vm_stack_canary, rb_vm_opt_cfunc_p, rb_vm_opt_mod, rb_vm_ic_hit_p, rb_vm_splat_array, rb_vm_defined, rb_vm_cc_general, rb_aliased_callable_method_entry, rb_find_defined_class_by_owner, rb_vm_call_ivar_attrset_p, rb_iseq_only_kwparam_p, rb_iseq_only_optparam_p, rb_vm_set_ivar_idx, rb_vm_setinstancevariable, rb_vm_setclassvariable, rb_vm_getclassvariable, rb_vm_rewrite_cref, rb_vm_get_cref, rb_vm_block_ep_update, rb_vm_cref_new_toplevel, rb_vm_cref_dup_without_refinements, rb_vm_frame_block_handler, rb_vm_cframe_keyword_p, rb_vm_ep_local_ep
transform_mjit_header: making declaration static inline: rb_vm_lvar_exposed, rb_vm_lvar_exposed, Init_vm_stack_canary, rb_vm_rewrite_cref, rb_vm_frame_block_handler, rb_vm_block_ep_update, rb_vm_ep_local_ep
transform_mjit_header: SKIPPED to transform: __sigbits, isspecial, isrune, isphonogram, isnumber, isideogram, ishexnumber, digittoint, toupper, tolower, toascii, isxdigit, isupper, isspace, ispunct, isprint, islower, isgraph, isdigit, iscntrl, isblank, isalpha, isalnum, __wcwidth, __isctype, __istype, isascii, __sincospi, __sincospif, __sincos, __sincosf, __inline_isnormall, __inline_isnormald, __inline_isnormalf, __inline_signbitl, __inline_signbitd, __inline_signbitf, __inline_isnanl, __inline_isnand, __inline_isnanf, __inline_isinfl, __inline_isinfd, __inline_isinff, __inline_isfinitel, __inline_isfinited, __inline_isfinitef, __darwin_fd_clr, __darwin_fd_set, __darwin_fd_isset, __darwin_check_fd_set, __sputc
ln -sf ../../../.ext/include/arm64-darwin22/rb_mjit_min_header-3.1.2.h include/ruby-3.1.0/arm64-darwin22/rb_mjit_min_header-3.1.2.h

JIT ォ〜? となったのでよくよくエラーを見ていた所、 ld: library not found for -lcapstone が出ている。 -lcapstone って何ヨ!

capstone

こういうことらしい、なんかしらの依存性の解決で一緒にインストールされるっぽい。

techracho.bpsinc.jp

記事の通り、 capstone だけ依存性を無視して削除して試してみる。

❯ brew uninstall --ignore-dependencies capstone
Uninstalling /opt/homebrew/Cellar/capstone/4.0.2... (25 files, 14.7MB)

おっ、できた。

#リトライ

❯ rbenv install 3.1.2
To follow progress, use 'tail -f /var/folders/np/w6ml9cp529j92kms59xq43lr0000gn/T/ruby-build.20230202185126.14100.log' or pass --verbose
Downloading openssl-3.0.7.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/83049d042a260e696f62406ac5c08bf706fd84383f945cf21bd61e9ed95c396e
Installing openssl-3.0.7...
Installed openssl-3.0.7 to /Users/donbulinux/.anyenv/envs/rbenv/versions/3.1.2

Downloading ruby-3.1.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.2.tar.gz
Installing ruby-3.1.2...
ruby-build: using readline from homebrew
ruby-build: using gmp from homebrew
Installed ruby-3.1.2 to /Users/donbulinux/.anyenv/envs/rbenv/versions/3.1.2


NOTE: to activate this Ruby version as the new default, run: rbenv global 3.1.2

❯ rbenv versions
* system
  2.5.1
  2.6.5
  2.7.6
  3.1.0
  3.1.2

おっできた。

なにこれ

上記記事にもリンクが存在しておりましたが、どうも JIT 有効化時の問題のようです。

Just to update everybody, we're in the process of porting YJIT to Rust and hoping to upstream that next month. This should fix the capstone issue as the library will only be used when building in dev mode.

github.com

という事で実際 Ruby 3.1.3 以降なら大丈夫らしい。

ちなみに fish 使ってる兄貴が書いていたワークアラウンド試してみたけどダメでした、しゃーなし。 可能なら Ruby 3.1.3 以上にしたほうがよさそう。

その他

SIP 無効化しているとインストールできない、というヤツを過去に見た記憶があったのでソレかと思っていた。

www.hsbt.org

github.com

今使っている M1、変更したタイミングで SIP 無効化したとかやった訳ではないので悩んでいたのであった。 これじゃなくてよかったー。

capstone がどこからきたのか

qemu 入れた覚えないんだけどな、と悩んでいたのだけど理由が判明した。

Lima で Docker 環境を構築しており、 lima 起動しようとしてエラーが出た。

❯ less /Users/donbulinux/.lima/docker_x86_64/ha.stderr.log
{"level":"debug","msg":"Creating iso file /Users/donbulinux/.lima/docker_x86_64/cidata.iso","time":"2023-02-03T19:46:07+09:00"}
{"level":"debug","msg":"Using /var/folders/np/w6ml9cp529j92kms59xq43lr0000gn/T/diskfs_iso3020372545 as workspace","time":"2023-02-03T19:46:07+09:00"}
{"level":"debug","msg":"OpenSSH version 9.0.1 detected","time":"2023-02-03T19:46:07+09:00"}
{"level":"debug","msg":"AES accelerator seems available, prioritizing aes128-gcm@openssh.com and aes256-gcm@openssh.com","time":"2023-02-03T19:46:07+09:>
{"level":"debug","msg":"Start udp server listening on: 127.0.0.1:62323","time":"2023-02-03T19:46:07+09:00"}
{"level":"debug","msg":"Start tcp server listening on: 127.0.0.1:60347","time":"2023-02-03T19:46:07+09:00"}
{"level":"fatal","msg":"failed to run [/opt/homebrew/bin/qemu-system-x86_64 -M none -accel help]: stdout=\"\", stderr=\"dyld[24516]: Library not loaded:>
/Users/donbulinux/.lima/docker_x86_64/ha.stderr.log lines 1-7/7 (END)

これだー! ここで qemu 使っている。 で、現状本記事の通り capstone を削除していたので、試しに brew で確認してみた。

❯ brew install qemu
Running `brew update --auto-update`...
==> Auto-updated Homebrew!
Updated 4 taps (aquasecurity/trivy, homebrew/core, homebrew/cask and homebrew/bundle).
==> New Formulae
cargo-make               clang-build-analyzer     juicefs                  m1ddc                    qdmr                     xcdiff
cargo-release            crfsuite                 libaribcaption           opencl-clhpp-headers     tetra
==> New Casks
capslocknodelay                lotus                          pokemon-tcg-live               spotify4bigsur                 ulbow
copilot-for-xcode              monofocus                      rive                           spybuster

You have 65 outdated formulae and 2 outdated casks installed.
You can upgrade them with brew upgrade
or list them with brew outdated.

Warning: qemu 7.2.0 is already installed and up-to-date.
To reinstall 7.2.0, run:
  brew reinstall qemu

まあそうだね、したら reinstall 叩いてみましょ!

❯ brew reinstall qemu
==> Fetching dependencies for qemu: capstone, pcre2, glib, ca-certificates, libunistring, guile, libidn2, unbound, gnutls, jpeg-turbo, ncurses and xz
==> Fetching capstone
==> Downloading https://ghcr.io/v2/homebrew/core/capstone/manifests/4.0.2
Already downloaded: /Users/donbulinux/Library/Caches/Homebrew/downloads/d8caa83b6b16573878067f49634ea8c0e94c617b48dd9516b31f0cea46b40cb9--capstone-4.0.2.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/capstone/blobs/sha256:4a7f3c31862791da2c3e9436880a84953ad61a7764fbac208fb6b6999ee139dc
Already downloaded: /Users/donbulinux/Library/Caches/Homebrew/downloads/329e70ea4654b595a9262a2fee26cd57393ff14964cb74e24ae00e89c8207610--capstone--4.0.2.arm64_ventura.bottle.tar.gz

...

アオオッ!!

ということで capstone どこからきたのか、 qemu とは……の答えは Lima でした。 死ぞ。