Skip to content

提案: 静的リンクされた musl ターゲットの追加#9

Draft
yuimarudev wants to merge 1 commit intot3tra-dev:mainfrom
yuimarudev:main
Draft

提案: 静的リンクされた musl ターゲットの追加#9
yuimarudev wants to merge 1 commit intot3tra-dev:mainfrom
yuimarudev:main

Conversation

@yuimarudev
Copy link
Copy Markdown
Contributor

@yuimarudev yuimarudev commented Dec 14, 2025

実行時依存がある場合、動作が困難な環境が存在します。とくに Linux ターゲットではさまざまな環境があり、実行時依存の解決が難しい場合があるので、この問題を解決するために、CI のビルド時に全てのライブラリを静的リンクしたバイナリを吐く工程を追加することを提案します。

フォークの CI #1 では、全てのビルドが成功し成果物が生成されています。linux-* の mozuku-lsp が正しくビルドされているか確認するために、file コマンドと readelf コマンドを使用してバイナリを評価しました。

$ ls

mozuku-linux-aarch64-musl.zip
mozuku-linux-aarch64.zip
mozuku-linux-x86_64-musl.zip
mozuku-linux-x86_64.zip

$ for i in `ls`; do   TARGET="${i:13:-4}"; OUTPUT="mozuku-lsp-$TARGET"; unzip -p $i mozuku-lsp/build/mozuku-lsp > $OUTPUT; echo file $OUTPUT:; file $OUTPUT; echo; echo readelf -d $OUTPUT:; readelf -d $OUTPUT; echo =======; done

file mozuku-lsp-aarch64-musl:
mozuku-lsp-aarch64-musl: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, with debug_info, not stripped

readelf -d mozuku-lsp-aarch64-musl:

There is no dynamic section in this file.
=======
file mozuku-lsp-aarch64:
mozuku-lsp-aarch64: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=a82c21137fbed9d8761f201fdb890a8405e0705e, for GNU/Linux 3.7.0, not stripped

readelf -d mozuku-lsp-aarch64:

Dynamic section at offset 0xe3f6b0 contains 34 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libcurl.so.4]
 0x0000000000000001 (NEEDED)             Shared library: [libcabocha.so.5]
 0x0000000000000001 (NEEDED)             Shared library: [libmecab.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libtree-sitter.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [ld-linux-aarch64.so.1]
 0x000000000000000c (INIT)               0x1c098
 0x000000000000000d (FINI)               0xf5970
 0x0000000000000019 (INIT_ARRAY)         0xe37708
 0x000000000000001b (INIT_ARRAYSZ)       16 (bytes)
 0x000000000000001a (FINI_ARRAY)         0xe37718
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x298
 0x0000000000000005 (STRTAB)             0x1790
 0x0000000000000006 (SYMTAB)             0x2d8
 0x000000000000000a (STRSZ)              7452 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0xe3f910
 0x0000000000000002 (PLTRELSZ)           4368 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x1af88
 0x0000000000000007 (RELA)               0x3858
 0x0000000000000008 (RELASZ)             96048 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000000000001e (FLAGS)              BIND_NOW
 0x000000006ffffffb (FLAGS_1)            Flags: NOW PIE
 0x000000006ffffffe (VERNEED)            0x3668
 0x000000006fffffff (VERNEEDNUM)         5
 0x000000006ffffff0 (VERSYM)             0x34ac
 0x000000006ffffff9 (RELACOUNT)          3945
 0x0000000000000000 (NULL)               0x0
=======
file mozuku-lsp-x86_64-musl:
mozuku-lsp-x86_64-musl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, with debug_info, not stripped

readelf -d mozuku-lsp-x86_64-musl:

There is no dynamic section in this file.
=======
file mozuku-lsp-x86_64:
mozuku-lsp-x86_64: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=eeedf9fafc70ba47dc0c18a24507d9792405283c, for GNU/Linux 3.2.0, not stripped

readelf -d mozuku-lsp-x86_64:

Dynamic section at offset 0xe387c0 contains 33 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libcurl.so.4]
 0x0000000000000001 (NEEDED)             Shared library: [libcabocha.so.5]
 0x0000000000000001 (NEEDED)             Shared library: [libmecab.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libtree-sitter.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x1d000
 0x000000000000000d (FINI)               0xf4434
 0x0000000000000019 (INIT_ARRAY)         0xe30410
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0xe30418
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x3b0
 0x0000000000000005 (STRTAB)             0x18c8
 0x0000000000000006 (SYMTAB)             0x488
 0x000000000000000a (STRSZ)              7434 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0xe38a10
 0x0000000000000002 (PLTRELSZ)           4200 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x1afb0
 0x0000000000000007 (RELA)               0x3988
 0x0000000000000008 (RELASZ)             95784 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000000000001e (FLAGS)              BIND_NOW
 0x000000006ffffffb (FLAGS_1)            Flags: NOW PIE
 0x000000006ffffffe (VERNEED)            0x3788
 0x000000006fffffff (VERNEEDNUM)         4
 0x000000006ffffff0 (VERSYM)             0x35d2
 0x000000006ffffff9 (RELACOUNT)          3934
 0x0000000000000000 (NULL)               0x0
=======

上記の出力を得ることができ、linux-*-musl が完全に静的リンクできていることがわかります。

@yuimarudev yuimarudev marked this pull request as draft December 14, 2025 08:54
@yuimarudev
Copy link
Copy Markdown
Contributor Author

yuimarudev commented Dec 14, 2025

システムの MeCab が見つからない場合 LS の初期化を止める処理 が存在するので、一旦ドラフトに戻します。
実行時に静的リンクを検知し、挙動を変更するなどの処理ができないか模索してみます。

また、私の環境で musl target のバイナリを動かした場合、システムの MeCab を見つけることに成功しその上辞書の発見に成功しても初期化が失敗するようなので、この問題を調査します。

[DEBUG] MeCabManager created with CaboCha enabled
[DEBUG] Analyzer created
[DEBUG] Initializing analyzer with config
[DEBUG] Detecting system MeCab installation...
[DEBUG] mecab-config --dicdir: /usr/lib/mecab/dic
[DEBUG] Found charset in dicrc: utf8
[DEBUG] dicrc says charset: utf8, testing actual behavior...
[DEBUG] System MeCab detection result - Available: yes, DicPath: /usr/lib/mecab/dic, Charset: utf8
[DEBUG] Using detected MeCab dicdir: /usr/lib/mecab/dic/ipadic
[DEBUG] MeCab args: -d /usr/lib/mecab/dic/ipadic
[ERROR] MeCab initialization failed with args '-d /usr/lib/mecab/dic/ipadic': 
[DEBUG] Trying MeCab without explicit dictionary path...
[ERROR] MeCab fallback initialization also failed: 
[ERROR] Failed to initialize MeCab
[DEBUG] Analyzing text of length: 701
[ERROR] MeCab tagger not available
[DEBUG] Starting grammar check
[DEBUG] Analyzing text of length: 701
[ERROR] MeCab tagger not available 

@yuimarudev yuimarudev changed the title 提案 (CI): 静的リンクされた musl ターゲットの追加 提案: 静的リンクされた musl ターゲットの追加 Dec 14, 2025
@t3tra-dev
Copy link
Copy Markdown
Owner

ありがとうございます。

MeCab, CaboCha 等の依存ライブラリを全て静的リンクする方法も以前は考えていたのですが、辞書を同梱すべきか否かで迷った結果、それぞれシステムのものを使って動作する現在の設計に落ち着いたという経緯があります。

と言うのも、辞書を同梱してしまうとビルド成果物のバイナリが巨大になってしまいますし、かと言ってライブラリのみを同梱してもユーザーが (MeCab をインストールしていないのに) 辞書を持っている必要が生まれてしまうためでした。

辞書の扱いについてどのようにするべきか、考えがあれば教えてください (私が誤解している可能性もあります)。

MeCab の初期化失敗の発見と調査は助かります!

@yuimarudev
Copy link
Copy Markdown
Contributor Author

返信ありがとうございます。

辞書の扱いについてどのようにするべきか、考えがあれば教えてください (私が誤解している可能性もあります)。

ビルド成果物のサイズの都合上、私もバイナリに辞書を同梱するべきではないと思っています。扱いとしては、適切な辞書(mecab-ipadic, mecab-ipadic-neologd, unidic 等)への案内を記述し、ユーザーにダウンロードさせるか、インストーラースクリプトなどを作成し選択させるという方式がよいと考えています。

@t3tra-dev
Copy link
Copy Markdown
Owner

辞書のインストールに関してはその方法を README に記載しておくことにします。

ありがとうございます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants