WSL1で動かないバイナリをどうにかして動かすための方法まとめ
created at
updated at
WSL1はMicrosoftによる完全独自なLinuxバイナリ動作環境であるが、いくら天下のMicrosoftとはいえ色々な箇所にバグがあり、そのために動かないバイナリが何個かある。
それが単一のバイナリだけならまだ何とかなるのだが、いよいよglibcすらバグって困ってきたので、この際自分が導入している回避策をまとめておく。
Dockerを動かす
2025年もWSL1を使っていくのとおりやってください。
Node.jsを動かす
PT_LOAD
なセグメントのアライメント(p_align
で定義されている)は全て同じ値であるとしているが、ELFの仕様上は別な値になる事を許容されており、実際に別な値になっているバイナリでは実行に失敗するというもの。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
コマンドで呼んだ時に正しい結果が帰ってこない問題がある。glibc 2.42以降ではtty関連の処理で
TCGETS2
コマンドを使うようになってしまったため、シェルなどのttyに依存するバイナリが動かなくなった。古い実装なら動くので、
TCGETS2
コマンドを使っている部分だけ古い実装にフォールバックさせるような共有ライブラリを用意してpreloadさせれば🆗tty-fixup.cpp · GitHub をビルドして
/etc/ld.so.preload
にsoファイルへのパスを書いておけば🆗それでも動かないなら
Dockerを動かせるようにしているなら、それで回避する。無理なら諦めよう❗