ライブラリに静的にリンクしているプログラム ( libA.2.0.a
) と、別のライブラリに動的にリンクしているプログラム ( ) がありlibB.so
ます。libB.so
また、古いバージョンの libA ( libA.1.0.so
) に動的にリンクします。
この構成は可能ですか?もしそうなら、システムはlibA.2.0.a
自分のプログラムの for からのシンボルと forlibA.1.0.so
からのシンボルを使用することをどのように知っていlibB.so
ますか?
ライブラリに静的にリンクしているプログラム ( libA.2.0.a
) と、別のライブラリに動的にリンクしているプログラム ( ) がありlibB.so
ます。libB.so
また、古いバージョンの libA ( libA.1.0.so
) に動的にリンクします。
この構成は可能ですか?もしそうなら、システムはlibA.2.0.a
自分のプログラムの for からのシンボルと forlibA.1.0.so
からのシンボルを使用することをどのように知っていlibB.so
ますか?
はい、この構成は可能です。
システムがシンボルの使用方法をどのように認識しているかについての質問への回答として、すべてのリンクがビルド時に発生することを思い出してください。ビルドされた後は、「シンボル」の問題ではなく、さまざまなアドレスでさまざまな関数を呼び出すだけです。
libB.so をビルドすると、libA.1.0.so へのリンクが設定されます。それを使用する他のアプリケーションが何をするかは知りませんし、気にもしません。それ自身の関数呼び出しをマップする方法を知っているだけです。
アプリケーション自体をビルドする場合、アプリケーションは libB.so にリンクします。libB.so が何を呼び出しても、アプリケーションはまったく知りません。また、アプリケーションはライブラリに静的にリンクしますが、libB.so はこれを気にしません。
1 つの落とし穴: libA が静的変数を使用する場合、libB.so がアクセスできる一連の静的変数と、アプリケーションがアクセスできる別の独立した一連の静的変数が存在します。