rcmdnk's blog

Embedded Glibc

LinuxbrewがHomebrewに統合され、Linux環境で個人環境を作るために使っていますが、 以前あったELF: x: Errorと行った感じのエラーがまた起こりました。

起こった問題

Linuxの環境はリモートでsshして使っているものですが、 ログインしてみたところ、.bashrcの中で使っているコマンドなどが色々エラーを吐き、 その後ログインは出来たものの、なにかコマンドを使おうにも

$ ls
ls: 0s": ELF: x: Error 1325453653

の様なエラーが出て何も出来ない状態。唯一Bashの内部コマンドだけは使えますが、 lsmvも全ての外部コマンドが使えない状態。

とりあえずまともに動くように

これは以前も見た現象です。

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

解決法

最初にインストールしたときにやったようにgccglibcを一旦削除して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

ggccglibcなしでインストールできました。

これで、

export LD_LIBRARY_PATH=$HOME/.linuxbrew/lib:$LD_LIBRARY_PATH

をしても問題が起こらない様になったはずです。

まとめ

この辺のglibcの問題関しては

  • Homebrewのglibcがシステムのglibcと衝突をを起こしてしまう
    • /usr/binにあるコマンドなどを全て無視することは出来ないのでこの様な衝突を起こしてしまう環境ではHomebrewでglibcはインストールしても使えない
  • /home/linuxbrew/.linuxbrewを使わない場合にbottleを直接入れられない
    • 一部のパッケージはコンパイル時に指定されたライブラリのPATHなどが内部に残っていて、/home/linuxbrew/.linuxbrew/以外の場所で使おうとするとうまく動かないものがある
    • 従って全てのパッケージは/home/linuxbrew/.linuxbrew以外に入れるときにはコンパイルして入れるようにしている
    • その際にgccがHomebrewでインストールされてなければインストールする
  • gcchttps://raw.githubusercontent.com/Linuxbrew/install/master/install.shを使ってHomebrewをインストールする時に自動的にインストールされてしまう。
    • ただし、このgccのインストール自体はHomebrew/brew)の中で行われているためLinuxbrew/installの方を変更してどうにかなるものでもない
    • Homebrew本体の方でLinuxbrewのインストーラーからオプションを渡してごちゃごちゃやるのはけっこう大変で、かつ、Macのこととは関係ないので優先度が低い

と言った感じで根本的に解決するのが難しい部分です。

Homebrewの方にプルリクエスト出してみようとちょっといじったりもしてたんですが、 そのためだけに無駄に複雑になってしまって多分拒否されそうだったので もうちょっと整理して、というところで止まってしまった状態です。

取り敢えずは上記の処方箋でなんとかなるのでそれで乗り切ってますが、 今回、アップグレードでも問題が起きたので、ちょっとその辺も含めてまた見てみたいとは思ってます。

Sponsored Links
Sponsored Links

« Macで濁点とかが起こす文字化け問題について HHKBの新バージョン発売!Bluetooth+Type-Sが実現 »

}