HP-UX General
1753379 メンバー
5366 オンライン
108792 解決策
新規ポスト

共有ライブラリのリンク先について

 
Hi_Ni
時折のアドバイザー

共有ライブラリのリンク先について

動的リンクについての質問です。

[環境]

OS : HP-UX 10.20

[事象]

プログラムAから共有ライブラリB内のCサブルーチンをコールしている処理があります。

今回、AおよびCを改修し、新たなプログラムA’と共有ライブラリB’をリリースしました。

その際、旧共有ライブラリBをバックアップディレクトリに退避させたのですが、どうも実行されるプログラムA’が旧共有ライブラリBを参照しているような動きをします。(つまり旧Cサブルーチンを取り込んでいる。)

同様の環境を別に作成し、上記モジュールで確認したところ、このような事象は発生しないです。(本番のみで発生)

[質問]

旧ライブラリを参照されるような事象は発生しうるのでしょうか。

なにか調査するきっかけになるようなことがあればよろしくお願いします。

7件の返信7
テレコム担当者
尊敬されているコントリビューター

共有ライブラリのリンク先について

>その際、旧共有ライブラリBをバックアップディレクトリに退避させたのですが、

どこに退避したかも重要です。

本番環境と SHLIB_PATH の設定の差分がありませんか?

# env | grep SHLIB_PATH
uhyo
貴重なコントリビューター

共有ライブラリのリンク先について

リンクの際には、もちろんですが新しいライブラリを

リンクしてますよね?

さらにいうと、アーカイブでのコンパイルとかは

されてないですよね。

あとは、環境変数SHLIB_PATH(だったかな?)などで

ライブラリの参照場所も変わったと思います。

最近、この手の話から遠ざかってしまったので

うろ覚えの記憶で間違いを記載していたら

申し訳ありません。ただ、man ldとかに今回記述した

内容の正確な話が記載されていたと思います。

あまり参考にならない書き込みで申し訳ありません。

Hi_Ni
時折のアドバイザー

共有ライブラリのリンク先について

返信ありがとうございます。不明確ですみません。

リンクはもちろん動的リンクで、新しい共有ライブラリをリンクしています。バックアップの移動先は、新共有ライブラリのあるディレクトリにbkディレクトリを作成し退避しました。

格納ディレクトリ自体は、ld の -L オプションで指定しています。

ちなみに、旧共通ライブラリがメモリに残るとかいうことはないのでしょうか。
S.Takeda
アドバイザー

共有ライブラリのリンク先について

プログラムAの起動方法にも拠りますが、tuscを使用してプログラムAのトレースを取ることが出来るのであれば、tuscの結果からリンクしている共有ライブラリはトレースできたと思います。
Hi_Ni
時折のアドバイザー

共有ライブラリのリンク先について

tusc というコマンドがあるのですね。

ただ、tusc を(本番環境に)入れていないため、断念ですが、chatr コマンドでは、意図した新共有ライブラリがリンクされていることを確認しています。

oops
貴重なコントリビューター

共有ライブラリのリンク先について

共有ライブラリBを使用している他のプロセス(プログラム)はいないのでしょうか?

共有ライブラリはメモリ上にマップされます。例えばプログラムAとBがあって、プログラム Aだけを終了して、新しいライブラリと置き換えたとしても、B を終了するまでは古い共有ライブラリはメモリ上に残ったままになります。(そうでないと困りますよね。)

libc のパッチに reboot がいるのはそのためです。(libc とリンクしていないプログラムはないため、libc をメモリから unmap するには、システムを落とすしかないということです。)

古い共有ライブラリを使ってそうなプログラムをすべて restart させるか、システム自体を再起動することはできませんか?

Hi_Ni
時折のアドバイザー

共有ライブラリのリンク先について

モジュールの特定まではできなかったのですが、リブートを実施しました。

新共有ライブラリをリンクするようになり解決です。

ありがとうございました。