WSL1で動かないバイナリをどうにかして動かすための方法まとめ

created at
updated at
technology WSL Arch_Linux Node.js glibc

WSL1はMicrosoftによる完全独自なLinuxバイナリ動作環境であるが、いくら天下のMicrosoftとはいえ色々な箇所にバグがあり、そのために動かないバイナリが何個かある。
それが単一のバイナリだけならまだ何とかなるのだが、いよいよglibcすらバグって困ってきたので、この際自分が導入している回避策をまとめておく。

Dockerを動かす
2025年もWSL1を使っていくのとおりやってください。

Node.jsを動かす
Node.jsに限らないが、Exec format error で実行できないバイナリがいくつかある。これは lxcore.sys のバグで、ELFパーサの実装ミスによるもの。
PT_LOAD なセグメントのアライメント(p_align で定義されている)は全て同じ値であるとしているが、ELFの仕様上は別な値になる事を許容されており、実際に別な値になっているバイナリでは実行に失敗するというもの。
詳しくは gzip from Ubuntu Jammy doesn't execute · Issue #8219 · microsoft/WSL · GitHub を参照。
lxcore.sys にパッチを当てるのは現実的ではないし修正もされる気配がないので、バイナリ側にパッチを当てて回避しよう。
Python script to fix the "exec format error" seen with tools like gzip in WSL with Ubuntu 22.04 in Q1/Q2 2022 · GitHub のように、アライメントを全て一致させるように調整すれば🆗

glibc 2.42以降を動かす
ioctlシステムコールの実装にバグがあり、 TCGETS2 コマンドで呼んだ時に正しい結果が帰ってこない問題がある。
詳しくは ioctl TCGETS2 and friends · Issue #2595 · microsoft/WSL · GitHub を参照。
glibc 2.42以降ではtty関連の処理で TCGETS2 コマンドを使うようになってしまったため、シェルなどのttyに依存するバイナリが動かなくなった。
古い実装なら動くので、TCGETS2 コマンドを使っている部分だけ古い実装にフォールバックさせるような共有ライブラリを用意してpreloadさせれば🆗
tty-fixup.cpp · GitHub をビルドして /etc/ld.so.preload にsoファイルへのパスを書いておけば🆗

それでも動かないなら
Dockerを動かせるようにしているなら、それで回避する。無理なら諦めよう❗