Solaris の fatal: relocation error:2013年10月04日 13時56分24秒

Solaris でプログラムを実行時に以下のエラーを残して急に落ちることがある。

ld.so.1: XXX fatal: relocation error: XXX: XXX: referenced symbol not found

XXX の部分は見付からなかった関数名だ。これが起こる原因はおそらくこの二つ。

まずは、リンク時と実行時のライブラリに不整合がある時になる。リンクされたバイナリを他のホストに移したが、同じライブラリが無かった場合に起こる。良く起こる場合としては、他所から共有ライブラリを使っているが、うっかり全てのホストにはインストールされていなかったなど。

そしてもう一つは、-lznodefs をリンカに渡して、解決仕切れなかったシンボルが存在したときに、起きる可能性がある。なぜ、起きる可能性があるかと遠回しな言い方をするかというと、実行時にこの関数を呼ばなければ、落ちることは無いからだ。

-lznodefs は名前から察する通り、解決仕切れないシンボルがあっても、プログラムのリンクを正しく終了できた事にしてしまうオプションだ。この事からも、本番環境に用いるプログラムでは、絶対に避けるべきオプションである。このオプションを使わないと、一つでも見付からないシンボルがあるとプログラムの生成は成功しない。

それではいつ使うかと言うと、やはり開発環境になる。共有ライブラリを用いたり、相互依存の醜いライブラリ群があると、いちいち再リンクをするのに時間と手間がかかる。開発環境で部分的な試験をしている時は、全部のコードが実行される事はほとんど無いので、業と呼ばれない部分を無視してしまうのだ。どうせ、本番環境では使わない邪道を用いて開発効率を上げているのだから、いちいち関係の無い細部に拘る必要もない。

しかし、時として見付からないシンボルがあって、実行時に落ちることがある。そんなときは、ldd -d を使って、どのシンボルが解決できていないかを探る。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2013/10/04/7000054/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。