ライブラリー間のオブジェクト初期化の順序

実行時にアプリケーションのすべてのモジュールがロードされると、モジュールは、その優先順位に従って初期化されます (main 関数を含む実行可能プログラムには、常に優先順位 0 が割り当てられます)。ライブラリー内でオブジェクトが初期化される場合は、初期化の順序は、オブジェクトへの優先順位の割り当てで説明されている規則に従います。オブジェクトに優先順位が割り当てられていない場合、あるいは同じ優先順位が割り当てられている場合は、オブジェクト・ファイルはランダムに初期化され、そのファイル内のオブジェクトは宣言の順序に従って初期化されます。オブジェクトは、その構成とは逆の順序で終了されます。

静的ライブラリーと共用ライブラリーはそれぞれ、その依存関係がすべてロードされ、初期化された後に、実行時にはリンク順序とは の順序でロードおよび初期化されます。リンク順序とは、個々のライブラリーがメインアプリケーションへのリンク中にコマンド行にリストされた順序のことです。例えば、ライブラリー A がライブラリー B を呼び出す場合、ライブラリー B はライブラリー A より前にロードされています。

個々のモジュールがロードされると、オブジェクトは、 オブジェクトへの優先順位の割り当てで概説した規則に従って、優先順位の順序で初期化されます。オブジェクトに優先順位が割り当てられていない場合、あるいは同じ優先順位が割り当てられている場合は、オブジェクト・ファイルはリンク順序の逆順で初期化され (リンク順序とは、ファイルがライブラリーにリンクするときにコマンド行で与えられた順序のことです)、そのファイル内のオブジェクトは宣言の順序に従って初期化されます。オブジェクトは、その構成とは逆の順序で終了されます。

複数ライブラリー間のオブジェクト初期化の例

この例では、以下のモジュールが使用されています。

従属ライブラリーは、次のコマンド・ストリングによって作成されます。

xlC -qmkshrobj -o libS3 fileE.o fileF.o 
xlC -qmkshrobj -o libS4 fileG.o fileH.o
xlC -qmkshrobj -o libS5 fileI.o fileJ.o
xlC -qmkshrobj -o libS6 fileK.o fileL.o

従属ライブラリーは、次のコマンド・ストリングによって親ライブラリーとリンクされます。

xlC -qmkshrobj libS1 fileA.o fileB.o -L. -lS3 -lS4
xlC -qmkshrobj libS2 fileC.o fileD.o -L. -lS5 -lS6

親ライブラリーは、次のコマンド・ストリングによってメインプログラムとリンクされます。

xlC main.c -o main.out -L. -lS1 -lS2

次の図は、共用ライブラリーの初期化順序を示したものです。

図 1. Linux でのオブジェクト初期化順序


Linux でのオブジェクト 初期化順序

オブジェクトは、次のように初期化されます。


シーケンス オブジェクト コメント
1 libS6 libS2 は、main とリンクされる際、コマンド行で最後に入力されました。したがって、 libS1 より前に初期化されます。ただし、libS5 および libS6libS2 と依存関係にあるので、この両者が最初に初期化されます。libS6 は、 libS2 とリンクされる際にコマンド行で最後に入力されたため、最初に初期化されます。このライブラリーのオブジェクトは、その優先順位に従って初期化されます。 (優先順位が割り当てられていない場合、fileL 内のオブジェクトが fileK 内のオブジェクトよりも前に初期化されます。これは、オブジェクト・ファイルが libS6 にリンクされたときにコマンド行で fileL が最後にリストされたためです。)
2 libS5 libS5 は、libS2 とリンクされる際、コマンド行で libS6 より前に入力されたため、次に初期化されます。このライブラリーのオブジェクトは、その優先順位に従って初期化されます。 (優先順位が割り当てられていない場合、fileJ 内のオブジェクトが fileI 内のオブジェクトよりも前に初期化されます。これは、オブジェクト・ファイルが libS5 にリンクされたときにコマンド行で fileJ が最後にリストされたためです。)
3 libS4 libS4 は、libS1 と依存関係にあり、 libS1 とリンクする際に、コマンド行で最後に入力されたため、次に初期化されます。このライブラリーのオブジェクトは、その優先順位に従って初期化されます。 (優先順位が割り当てられていない場合、fileH 内のオブジェクトが fileG 内のオブジェクトよりも前に初期化されます。これは、オブジェクト・ファイルが libS4 にリンクされたときにコマンド行で fileH が最後にリストされたためです。)
4 libS3 libS3 は、libS1 と依存関係にあり、 libS1 とリンクする際に、コマンド行で最初に入力されたため、次に初期化されます。このライブラリーのオブジェクトは、その優先順位に従って初期化されます。 (優先順位が割り当てられていない場合、fileF 内のオブジェクトが fileE 内のオブジェクトよりも前に初期化されます。これは、オブジェクト・ファイルが libS3 にリンクされたときにコマンド行で fileF が最後にリストされたためです。)
5 libS2 libS2 は次に初期化されます。このライブラリーのオブジェクトは、その優先順位に従って初期化されます。 (優先順位が割り当てられていない場合、fileD 内のオブジェクトが fileC 内のオブジェクトよりも前に初期化されます。これは、オブジェクト・ファイルが libS2 にリンクされたときにコマンド行で fileD が最後にリストされたためです。)
6 libS1 libS1 は次に初期化されます。このライブラリーのオブジェクトは、その優先順位に従って初期化されます。 (優先順位が割り当てられていない場合、fileB 内のオブジェクトが fileA 内のオブジェクトよりも前に初期化されます。これは、オブジェクト・ファイルが libS1 にリンクされたときにコマンド行で fileB が最後にリストされたためです。)
7 main.out 最後に初期化されます。main.out のオブジェクトは、その優先順位に従って初期化されます。

IBM Copyright 2003