以前Ryosuke Iwanagaさんの記事
https://blog.riywo.com/2012/04/01/023321/
を読んで根本的な関数などをまるっと置き換えられる便利な環境変数があるんだなーという印象を持ち、どこかで検証のために使ってみたいと思っていましたが、自動的に使うことになってしまいました。
ARMコアのLinuxでtensorflowを使おうとしましたが、色々バージョンがあわずglibcを最新に更新する必要がありそうで、試したところOSがぶっこわれました。
ちゃんとコンパイルするglibcを選んできた気がしたのですが、互換性のないglibcが入ってしまったようで基本のlsコマンドすら打てない状態。
何もできないし、ログアウトしたらもう2度とログインできない状態になりましたが、
export LD_PRELOAD="/lib64/libc-2.17.so"
と元のバージョンを指定するとlsコマンドなど普通のコマンドが復活しました。
なるほど「LD_PRELOAD」を使えるとOSが持っているライブラリをパスして自分が用意したライブラリを使うことができるのだと。
残念ながらシステム復元はできませんでした。システム領域のシンボリックリンク書き換えのためにsudoするとLD_PRELOADが無効になり、スーパーユーザーになれません。
普段sudoしか使わないので、パスワードは設定しておらずsuもできず。最初からスーパーユーザーで作業しておれば復元可能でした。
システムは復元できませんでしたが、LD_PRELOADの働きについては身に染みて理解しました。 既存のコマンドたちにも影響を与えるのでセキュリティ的にも際どい気がします。
あとglibcの手動置き換えは結構やばい作業だと感じました。まぁオペレーションが悪かっただけでしょうが、今回のような実験用環境でなかったら冷や汗ものです。