[Solved] relocation error: /lib64/libc.so.6: symbol _dl_starting_up 解決法





# 起こったこと What happened
Cent OS6 にyumでNode.js をインストールしようとしたら、
依存関係エラーが出て、入らなかったので、
試行錯誤したら、危うく全データを失うところだった。

なんとか幸運にも回避できたので、メモ。

## GLIBC の依存関係


```Bash
$ yum install nodejs
--> Finished Dependency Resolution
Error: Package: 2:nodejs-12.2.0-1nodesource.x86_64 (nodesource)
           Requires: libc.so.6(GLIBC_2.17)(64bit)
```

libc.so.6 のバーションが違うらしい。
試行錯誤していたら、
以下ln コマンドの後、以降(ほぼ全ての)コマンド操作ができなくなってしまった。

```Bash
$ ln -sf /lib64/libc-2.17.so /lib64/libc.so.6
$ ls
ls: relocation error: /lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
```

`ほぼ全てのコマンド`で。
(この状態で、ログアウトしアクセスを失うと、もはや*OS再インストールしかないよう*。)


```Bash
$ curl
Segmentation fault (core dumped)
```
(core dumped) 詰んだ?



どうやら、ほとんどのコマンドが /lib64/libc.so.6 に依存しているようであり、
マシン環境に合わないものにSymbolic link がすり替わってしまったため。


`/lib64/libc-2.17.so` に対応する GIBC_2.17 がない
コンパイルして入れればよさそうだ

```
$ strings /lib64/libc.so.6 | grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE

```

# 解決法 Solution


とりあえず、緊急なので
もし元のファイル(ここでは`/lib64/libc-2.12.so`) があるなら
以下のようにして戻せる。
(`LD_PRELOAD="/lib64/libc-2.12.so"` 指定の後にコマンド実行)


```Bash
LD_PRELOAD="/lib64/libc-2.12.so" ln -sf /lib64/libc-2.12.so /lib64/libc.so.6  #-f で上書きforce
```

例えば (ログインセッション中でなら)

```Bash
$ export LD_PRELOAD="/lib64/libc-2.12.so" 
$ ls
hoge boo bar ..
```


たまたま、(幸運にも)解決方法を見つけたからよいけど、
もし見つけられなかったら、全データを消すことになっていた。


同じような誰かに役立てば幸いだ。



Note: Never logout/restart kernel!
It will not launch again then.

It seems Symlink of GlibC is wrong.

I hope this will help :)


## GLIBC_2.17 をCentOS6 にコンパイルする

方法があったので
やってみる

```
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm
$ wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm

$ sudo rpm -Uvh glibc-2.17-55.el6.x86_64.rpm \
glibc-common-2.17-55.el6.x86_64.rpm \
glibc-devel-2.17-55.el6.x86_64.rpm \
glibc-headers-2.17-55.el6.x86_64.rpm  --force --nodeps # force する

$ strings /lib64/libc.so.6 | grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_PRIVATE

# GLIBC_2.13 以降増えた

$ LD_PRELOAD="/lib64/libc-2.17.so" ls # 問題なく動くよう
hoge 

$ ln -sf /lib64/libc-2.17.so /lib64/libc.so.6 # 新しく入れたのにsymlink貼り替え
# 念の為、いくつかterminal でログインしてsession確保した状態で

```
https://serverkurma.com/linux/how-to-update-glibc-newer-version-on-centos-6-x/

動いた


## 結局
node.js については、
~~ソースコードからcompileすれば、使えた。~~ node.jsは、NVM 経由でインストールが手軽。


NVM install
https://tecadmin.net/install-nodejs-with-nvm/



https://www.digitalocean.com/community/tutorials/how-to-compile-node-js-with-npm-from-source-on-centos-6

```Bash
$ rm -f /etc/yum.repos.d/nodesource-el* # 最新のrpmが入っている場合、消す。
$ curl -sL https://rpm.nodesource.com/setup_7.x | bash -
$ yum install nodejs
$ node --version
v10.15.3
```


https://unix.stackexchange.com/questions/261950/why-wont-the-correct-new-version-of-node-js-install-on-centos-7

# 追記

CentOS6 とか古いOS だと`yum update` で勝手に `/lib64/libc.so.6` 更新されて
この現象が起きるもよう
注意。


## 参考

https://qiita.com/komeda-shinji/items/6a86a0b466a67ddf3f47

https://qiita.com/komeda-shinji/items/798a2c12136937135c3b

https://www.slideshare.net/komeda-shinji/centos6-zabbix-30