5.3.1.2 OpenVMS I64 での初期化済みオーバーレイ・プログラム・セクションの取り扱い
Alpha および VAX システムでは,オーバーレイ・プログラム・セクションの一部に対する初期化が可能でした。同じ部分に対して複数回初期化を行うと,前のモジュールで行われた初期化が上書きされます。リンクされるイメージで,それぞれのバイトごとに,最後に実行された初期化の内容が,そのバイトの最終値として適用されます。
I64 システムの ELF (Executable and Linkable Format) オブジェクト言語は,セクションの一部を初期化するという Alpha および VAX オブジェクト言語の機能を実装していません。 I64 システムで初期化を行うと,セクション全体が初期化されます。このセクションのその後の初期化は,ゼロ以外の部分が値で一致する場合のみ実行されます。
たとえば以下の条件の場合は, OpenVMS I64 システムと Alpha システムで異なる結果が発生します。
それぞれが 2 つのロングワードを宣言する 2 つのプログラム・セクション (ELF では単にセックションと呼ぶ) がオーバーレイされた場合。最初のプログラム・セクションが最初のロングワードを初期化し, 2 番目のプログラム・セクションは 2 番目のロングワードをゼロ以外の値で初期化します。
OpenVMS Alpha システムでは,リンカは,最初のロングワードと 2 番目のロングワードが初期化されたイメージ・セクションを作成します。 VAX および Alpha オブジェクト言語は,セクションを初期化するために,セクション・サイズと TIR (Text Information Relocation) コマンドをリンカに与えます。
OpenVMS I64 システムでは,リンカは,コンパイラからの初期化データを含む事前に初期化されたイメージ・セクションを取得します。 ELF には TIR コマンドがないため,リンカは初期化は行わず,また初期化についての情報を持っていません。その後リンカは,最後に処理されたセクションを使用して初期化のためのセグメントを生成します。つまり,イメージの最初のロングワードあるいは 2 番目のロングワードのどちらかがゼロ以外の値に初期化されるかどうかは,モジュールがリンクされた順番によります。 I64 システムでは,オーバーレイされたセクションをリンカが読み取り,互換性 (初期化が同一であるか,または矛盾がないか) をチェックします。 2 つのオーバーレイ・セクションがゼロ以外の値で同一であれば,それらは互換性があります。初期化が一致していない場合は,リンカは次のようなエラーを出力します。