LD_BIND_NOW
仕事で扱っているSolaris 8で稼動しているアプリケーションがこういうバグを踏んでいる事が判明、調査をしています。
「libthreadにリンクしているアプリケーションが、ハングしたり異常終了する事がある」
というものですが、わたくしlibthreadが何なのかすら判らない有様でしたので調べてみました。
libthread・・・Solarisに実装されている、threadに関するライブラリ
で、これの不具合なのかな。
根本解決はパッチ適用なんですが、暫定対策として
アプリケーション実行前に
LD_BIND_NOW=1
という環境変数を設定する、というものがあるのでこれを実施したところ、問題は一応解決しました。
ただし
LD_BIND_NOW=1によって何が改善されたのかが不明なので、調べる事にしました。
Sunの「Linker and Libraries Guide」やらman ld.so.1によると、
runtime linker(Solarisだとld.so.1)がlazy binding(遅延BIND?遅延バインド?)をするのではなく、値と関数の呼び出しをアプリケーション実行前に行うようになる、
との事です。うーん直訳ですが何となく意味はわかった様な。つまり、
関数を必要になったら都度呼び出す(遅延BIND)
プログラム実行に必要な関数を始めに全て呼び出す
の違いか?
ただし、これを施すとなぜlibthreadの不具合が解消されるのかはわからんなー。
bshに
#!/bin/sh <略> exec truss -l -f プログラム名 >> ログ
みたいな実行をしてみてトレースしてみるか・・・。
ではー。