起こった問題
Linuxの環境はリモートでsshして使っているものですが、 ログインしてみたところ、.bashrcの中で使っているコマンドなどが色々エラーを吐き、 その後ログインは出来たものの、なにかコマンドを使おうにも
$ ls
ls: 0s": ELF: x: Error 1325453653
の様なエラーが出て何も出来ない状態。唯一Bashの内部コマンドだけは使えますが、
ls
もmv
も全ての外部コマンドが使えない状態。
とりあえずまともに動くように
これは以前も見た現象です。
Homebrewで入れたglibcが悪い。
何も出来ない状態で焦りますが、とりあえず
$ unset LD_LIBRARY_PATH
をすれば大概のコマンドは使える様になります。 もともと
$HOME/.linuxbrew/lib
をLD_LIBRARY_PATH
に加える様なことをしてなければ問題は起こりませんが、
それだとHomebrewで入れたツールが一部使えなかったりするので。
原因
この件に関してはgcc
を--without-glibc
でインストールすることで解決していたはずです。
試しにbrew ls
してみると何故かglibc
が居ました。
ここでgcc
の情報を見てみると
$ brew info gcc
gcc: stable 5.5.0 (bottled)
GNU compiler collection
https://gcc.gnu.org/
/home/user/.linuxbrew/Cellar/gcc/5.5.0_5 (1,325 files, 149.8MB) *
Poured from bottle on 2019-11-26 at 04:10:30
From: https://github.com/Homebrew/linuxbrew-core/blob/master/Formula/gcc.rb
==> Dependencies
Required: zlib ✔, gmp ✔, libmpc ✔, mpfr ✔, [email protected] ✔
Recommended: glibc ✔
==> Options
--without-glibc
Build without glibc support
==> Analytics
install: 105,120 (30 days), 302,485 (90 days), 1,023,467 (365 days)
install_on_request: 56,404 (30 days), 154,200 (90 days), 494,533 (365 days)
build_error: 0 (30 days)
といった感じ--without-glibc
は適用されてない状態です。
Poured from bottle on 2019-11-26 at 04:10:30
とありますが、どうやら最近アップデートがあってそれが入った模様。
この環境ではcronジョブで毎日brew upgrade
を行っているのでそれで入ったみたいです。
なぜか--without-glibc
が無視されてますが、
Homebrew自体はこの様なオプションは非推奨にしているので、
brew upgrade
などの際のオプションの取り扱いに問題があるのかもしれません。
一応他のパッケージもbrew deps --tree --installed
で確認してみましたが、
やはいgcc
だけがglibc
に依存しているのでそのせいです。
gcc
のアップグレードに関しては恐らく以下の辺の変更のあとのアップグレード。
Merge branch homebrew/master into linuxbrew/master · Homebrew/linuxbrew-core@1bc7d45
gcc: update 5.5.0_5 bottle. · Homebrew/linuxbrew-core@bb95011
解決法
最初にインストールしたときにやったようにgcc
、glibc
を一旦削除してgcc
を--without-glibc
で入れ直します。
gcc
は使わなければすぐにインストールする必要もないのですが、
/home/linuxbrew/.linuxbrew
を使わず個人の$HOME/.linuxbrew/
を使っている場合には
基本的にすべてのパッケージをコンパイルして入れることになり、その際にgcc
がインストールされることが多いです。
その際にglibc
が入ってしまうのを避けるため、明示的に--without-glibc
を指定して先にgcc
を入れておいた方が安全です。
$ brew uninstall gcc glibc
Uninstalling /home/user/.linuxbrew/Cellar/gcc/5.5.0_5... (1,325 files, 149.8MB)
Uninstalling /home/user/.linuxbrew/Cellar/glibc/2.23... (1,419 files, 46.1MB)
$ brew cleanup
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/curl/bin/curl: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/git/bin/git: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
Removing: /home/user/.cache/Homebrew/go_cache... (1,193 files, 66.7MB)
Pruned 3 symbolic links and 538 directories from /home/user/.linuxbrew
$ brew install gcc --without-glibc
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/curl/bin/curl: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/git/bin/git: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/curl/bin/curl: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/git/bin/git: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/curl/bin/curl: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/git/bin/git: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
Warning: git 2.24.0_2 is already installed and up-to-date
To reinstall 2.24.0_2, run `brew reinstall git`
Updating Homebrew...
Error: Git must be installed and in your PATH!
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/curl/bin/curl: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
/home/user/.linuxbrew/Homebrew/Library/Homebrew/brew.sh: /home/user/.linuxbrew/opt/git/bin/git: /home/user/.linuxbrew/lib/ld.so: bad ELF interpreter: No such file or directory
==> Downloading https://ftp.gnu.org/gnu/gcc/gcc-5.5.0/gcc-5.5.0.tar.xz
######################################################################## 100.0%
==> ../configure --with-isl=/home/user/.linuxbrew/opt/[email protected] --with-bugurl=https://github.com/Homebrew/linuxbrew-core/issues --with-boot-ldflags=-static-libstdc++ -static-libgcc --prefix=/home/user/.linuxbrew/Cellar/g
==> make BOOT_LDFLAGS=-Wl,-headerpad_max_install_names
==> make install-strip
==> Creating the GCC specs file: /home/user/.linuxbrew/Cellar/gcc/5.5.0_5/lib/gcc/x86_64-unknown-linux-gnu/5.5.0/specs
🍺 /home/user/.linuxbrew/Cellar/gcc/5.5.0_5: 1,335 files, 143.4MB, built in 10 minutes 48 seconds
$ brew info gcc
gcc: stable 5.5.0 (bottled)
GNU compiler collection
https://gcc.gnu.org/
/home/user/.linuxbrew/Cellar/gcc/5.5.0_5 (1,335 files, 143.4MB) *
Built from source on 2019-11-26 at 11:34:45 with: --without-glibc
From: https://github.com/Homebrew/linuxbrew-core/blob/master/Formula/gcc.rb
==> Dependencies
Required: zlib (installed), gmp (installed), libmpc (installed), mpfr (installed), [email protected] (installed)
Recommended: glibc (uninstalled)
==> Options
--without-glibc
Build without glibc support
ggcc
がglibc
なしでインストールできました。
これで、
export LD_LIBRARY_PATH=$HOME/.linuxbrew/lib:$LD_LIBRARY_PATH
をしても問題が起こらない様になったはずです。
まとめ
この辺のglibcの問題関しては
- Homebrewの
glibc
がシステムのglibc
と衝突をを起こしてしまう- /usr/binにあるコマンドなどを全て無視することは出来ないのでこの様な衝突を起こしてしまう環境ではHomebrewで
glibc
はインストールしても使えない
- /usr/binにあるコマンドなどを全て無視することは出来ないのでこの様な衝突を起こしてしまう環境ではHomebrewで
/home/linuxbrew/.linuxbrew
を使わない場合にbottleを直接入れられない- 一部のパッケージはコンパイル時に指定されたライブラリのPATHなどが内部に残っていて、
/home/linuxbrew/.linuxbrew/
以外の場所で使おうとするとうまく動かないものがある - 従って全てのパッケージは
/home/linuxbrew/.linuxbrew
以外に入れるときにはコンパイルして入れるようにしている - その際に
gcc
がHomebrewでインストールされてなければインストールする
- 一部のパッケージはコンパイル時に指定されたライブラリのPATHなどが内部に残っていて、
gcc
はhttps://raw.githubusercontent.com/Linuxbrew/install/master/install.sh
を使ってHomebrewをインストールする時に自動的にインストールされてしまう。- ただし、この
gcc
のインストール自体はHomebrew/brew)の中で行われているためLinuxbrew/installの方を変更してどうにかなるものでもない - Homebrew本体の方でLinuxbrewのインストーラーからオプションを渡してごちゃごちゃやるのはけっこう大変で、かつ、Macのこととは関係ないので優先度が低い
- ただし、この
と言った感じで根本的に解決するのが難しい部分です。
Homebrewの方にプルリクエスト出してみようとちょっといじったりもしてたんですが、 そのためだけに無駄に複雑になってしまって多分拒否されそうだったので もうちょっと整理して、というところで止まってしまった状態です。
取り敢えずは上記の処方箋でなんとかなるのでそれで乗り切ってますが、 今回、アップグレードでも問題が起きたので、ちょっとその辺も含めてまた見てみたいとは思ってます。