前へ | 次へ | 目次 | 索引 |
この章では,トランスレートされたVAXイメージとの間で呼び出しを実行できるネイティブなAlphaイメージの作成方法について説明します。
10.1 概要
『DECmigrate for OpenVMS AXP Systems Translating Images』では,VAX Environment Software Translator (VEST)を使用して,VAXの実行可能イメージまたは共有可能イメージを,それと同じ機能を実行するAlphaイメージに変換する方法を説明しています(DECmigrate for OpenVMS Alphaはオプションとして提供されるレイヤード・プロダクトであり,VAXアプリケーションをAlphaシステムに移行するのに必要なサポートを提供します。VESTはDECmigrateユーティリティの構成要素です)。
VESTを使用すれば,アプリケーションのすべての構成要素をトランスレートできます。たとえば,メインの実行可能イメージや,それを呼び出すすべての共有可能イメージをトランスレートできます。さらに,トランスレートされた部分とネイティブな部分が混在するアプリケーションも作成できます。たとえば,ネイティブ・イメージの高い性能を利用できるように,共有可能イメージのネイティブ・バージョンを作成し,それをトランスレートされたアプリケーションから呼び出すことができます。また,ネイティブな部分とトランスレートされた部分が混在するアプリケーションを作成しておき,その後で,段階的にアプリケーションのネイティブ・バージョンを作成することもできます。
トランスレートされたVAXイメージはネイティブなAlphaイメージと同様に使用できます。しかし,トランスレートされたイメージと相互操作可能なネイティブ・イメージを作成するには,この後の節に説明するように,特別な考慮が必要です。
10.1.1 トランスレートされたイメージと相互操作可能なネイティブ・イメージのコンパイル
トランスレートされたイメージとの間で呼び出しが可能なネイティブ・イメージを作成するには,ネイティブなAlphaイメージのソース・ファイルをコンパイルするときに /TIE修飾子を指定しなければなりません。外部の呼び出しモジュールから使用できるプロシージャを含むソース・モジュールは,/TIE修飾子を使用してコンパイルしなければなりません。/TIE修飾子を指定する場合には,トランスレートされたイメージとネイティブ・イメージの間で正しく呼び出しができるように,コンパイラは実行時にTranslated Image Environment (TIE)が必要とするプロシージャ・シグナチャ・ブロック(PSB)を作成します。TIEはオペレーティング・システムの一部です。
トランスレートされたイメージ内に存在する可能性のあるコールバック(つまり,指定されたプロシージャの呼び出し)を実行するプロシージャを含むソース・モジュールをコンパイルする場合にも,/TIE修飾子を指定しなければなりません。この場合には,/TIE修飾子を指定すると,コンパイラは特殊なランタイム・ライブラリ・ルーチンOTS$CALL_PROCに対する呼び出しを生成し,トランスレートされたプロシージャへの外部呼び出しが正しく処理されるようにします。
/TIE修飾子の他にも,トランスレートされたイメージとネイティブな共有可能イメージの間で正しく相互操作できるように,他のコンパイラ修飾子も指定しなければならないことがあります。たとえば,トランスレートされたイメージからネイティブな共有可能イメージを呼び出すときに,呼び出し側が倍精度浮動小数点演算のために VAXの D浮動小数点形式を使用する場合(VAX用のコンパイラの省略時の設定),Alphaシステムでは,倍精度データの省略時の形式はVAXの D浮動小数点ではないため,/FLOAT=D_FLOAT修飾子を指定しなければなりません。VAXの D浮動小数点形式を指定するための正確な修飾子の構文については,各コンパイラの解説書を参照してください。VAX のD浮動小数点データ型はAlphaアーキテクチャではサポートされないため,このデータ型を使用すると,性能が低下する可能性があります。
さらにアプリケーション固有のセマンティックに応じて,バイト粒度やデータ・アラインメント,ASTの不可分性などを強制的に設定するために,他のコンパイラ修飾子を指定しなければならない場合もあります。
10.1.2 トランスレートされたイメージと相互操作可能なネイティブ・イメージのリンク
トランスレートされたVAXイメージを呼び出すことができるネイティブなAlphaイメージを作成するには,/NONATIVE_ONLY修飾子を指定してネイティブなオブジェクト・モジュールをリンクしなければなりません (/NONATIVE_ONLYはこの修飾子に対してリンカが使用する省略時の設定です)。この修飾子を指定すると,リンカは,コンパイラが作成したPSB情報をイメージに挿入します。
/NATIVE_ONLY修飾子はネイティブ・イメージからトランスレートされたイメージへの呼び出しにのみ影響を与えるため,トランスレートされたVAXイメージから呼び出されるネイティブなAlphaイメージを作成する場合には,この修飾子を指定する必要はありません。リンカの省略時の動作(/NATIVE_ONLY修飾子)は,ネイティブ・イメージからトランスレートされたイメージを呼び出すことを禁止することになりますが,トランスレートされたイメージからネイティブ・イメージが呼び出されるのを防げるものではありません。
段階的なシステム移行に際して,共有可能イメージのネイティブ・バージョンのシンボル・ベクタのレイアウトは,トランスレートされた共有可能イメージのシンボル・ベクタのレイアウトと一致しなければなりません。トランスレートされた共有可能イメージをネイティブな共有可能イメージに置き換えることについての詳しい説明は,第 10.3 節 を参照してください。
10.2 トランスレートされたイメージの呼び出しが可能なネイティブ・イメージの作成
トランスレートされたVAX共有可能イメージを呼び出すことができるネイティブなAlphaイメージを作成するには,次の操作を実行します。
VESTを使用してVAXイメージをトランスレートする方法については,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。
ネイテイブなAlphaコードを作成するコンパイラを使用し,コマンド・ラインに /TIE修飾子を指定して,ソース・モジュールをコンパイルします。
他の共有可能イメージの場合と同様に,リンカ・オプション・ファイルにトランスレートされたイメージを指定します。
相互操作性について説明するために,例 10-1 と 例 10-2 に示したプログラムについて考えてみましょう。例 10-1 は,例 10-2 に定義されているmysubというルーチンを呼び出します。
例 10-1 メイン・プログラム (MYMAIN.C)のソース・コード |
---|
#include <stdio.h> int mysub(); main() { int num1, num2, result; num1 = 5; num2 = 6; result = mysub( num1, num2 ); printf("Result is: %d\n", result); } |
例 10-2 共有可能イメージ (MYMATH.C)のソース・コード |
---|
int myadd(value_1, value_2) int value_1; int value_2; { int result; result = value_1 + value_2; return( result ); } int mysub(value_1,value_2) int value_1; int value_2; { int result; result = value_1 - value_2; return( result ); } int mydiv( value_1, value_2 ) int value_1; int value_2; { int result; result = value_1 / value_2; return( result ); } int mymul( value_1, value_2 ) int value_1; int value_2; { int result; result = value_1 * value_2; return( result ); } |
これらの例からVAXイメージを作成するには,VAX システムのCコンパイラを使用してソース・モジュールをコンパイルします。共有可能イメージとして 例 10-2 を実現するには,モジュールをリンクし,そのとき,LINKコマンド・ラインに/SHAREABLE修飾子を指定し,UNIVERSALオプションを使用するか,または転送ベクタ・ファイルを作成することにより,共有可能イメージでユニバーサル・シンボルを宣言します(共有可能イメージの作成方法についての説明は『OpenVMS Linker Utility Manual』を参照してください)。次の例は,共有可能イメージMYMATH.EXEを作成するLINKコマンドを示しています。
$ LINK/SHAREABLE MYMATH.OBJ,SYS$INPUT/OPT GSMATCH=LEQUAL,1,1000 UNIVERSAL=myadd UNIVERSAL=mysub UNIVERSAL=mydiv UNIVERSAL=mymul [Ctrl/Z] |
メイン・プログラムと共有可能イメージをリンクすることにより,実行可能イメージMYMAIN.EXEを作成できます。次の例を参照してください。
$ LINK MYMAIN.OBJ,SYS$INPUT/OPT MYMATH.EXE/SHAREABLE [Ctrl/Z] |
リンカがVAXシステムの省略時のページ・サイズ(512バイト)より大きいページ・サイズを使用してイメージ・セクションを作成するようにするには,LINKコマンド・ラインに /BPAGE修飾子を指定しなければなりません。この修飾子を指定しなかった場合には,VAXイメージをトランスレートするときに,VESTはこれらの512バイトの多くのイメージ・セクションを1ページのAlphaイメージに集めなければなりません。保護属性が矛盾する隣接イメージ・セクションをVESTが同じAlphaページに集める場合,すべてのイメージ・セクションに対して,もっともゆるやかな保護を割り当て,警告を出します(/BPAGE修飾しの使い方についての詳しい説明は,『OpenVMS Linker Utility Manual』を参照してください)。
VAXイメージを作成した後,VESTを使用してそれらのイメージをトランスレートします。その場合,最初に共有可能イメージをトランスレートしなければなりません(VESTコマンドの使い方についての詳しい説明は,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください)。次の例では,MYMATH_TV.EXEとMYMAIN_TV.EXEという名前のトランスレートされたファイルを作成します(VESTはイメージ・ファイルの名前の最後に"_TV"という文字を追加します)。
$ VEST MYMATH.EXE $ VEST MYMAIN.EXE |
トランスレートされた実行可能なメイン・イメージMYMAIN_TV.EXEをネイティブ・バージョンと置き換えるには,Alphaコードを生成するコンパイラを使用して 例 10-1 に示したソース・モジュールをコンパイルします。そのとき,コンパイル・コマンド・ラインに/TIE修飾子を指定します。その後,ネイティブ・オブジェクト・モジュールMYMAIN.OBJをリンクして,ネイティブな Alphaイメージを作成します。次の例に示すように,他の共有可能イメージをリンクするときと同様に,トランスレートされた共有可能イメージをリンカ・オプション・ファイルに指定してください。
$ LINK/NONATIVE_ONLY MYMAIN.OBJ,SYS$INPUT/OPT MYMATH_TV.EXE/SHAREABLE [Ctrl/Z] |
ネイティブなメイン・イメージは他のAlphaイメージと同様に実行できます。トランスレートされた共有可能イメージの名前(MYMATH_TV)を,トランスレートされた共有可能イメージの位置を示す論理名として定義し (論理名SYS$SHAREによって示されるディレクトリに登録されていない場合),RUNコマンドを実行します。次の例を参照してください。
$ DEFINE MYMATH_TV YOUR$DISK:[YOUR_DIR]MYMATH_TV.EXE $ RUN MYMAIN |
10.3 トランスレートされたイメージから呼び出すことができるネイティブ・イメージの作成
トランスレートされたVAXイメージから呼び出すことができるネイティブな Alpha共有可能イメージを作成するには,次の操作を実行します。
最終的には,共有可能イメージのVAXバージョンをネイティブ・バージョンに置き換えますが,この時点ではVESTインターフェイス情報ファイル(IIF)を作成するために共有可能イメージをトランスレートしなければなりません。VESTは共有可能イメージを呼び出すイメージをトランスレートするときに,共有可能イメージに関連するIIFを必要とします。IIFファイルについての説明と,VAXイメージをトランスレートするためにVESTを使用する方法については,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください(トランスレートされた共有可能イメージ内でシンボル・ベクタのレイアウトを制御するには,この処理を繰り返さなければなりません。詳しくは 第 10.3.1 項 を参照してください)。
Alphaコードを生成するコンパイラを使用してソース・モジュールをコンパイルします。そのとき,コマンド・ラインに/TIE修飾子を指定します。
共有可能イメージでユニバーサル・シンボルを宣言するために,SYMBOL_VECTORオプションを使用します。互換性を維持するために,VAX共有可能イメージで宣言した順序と同じ順序で,SYMBOL_VECTORオプションにユニバーサル・シンボルを宣言します。
トランスレートされたVAX共有可能イメージと置換するために,ネイティブな Alpha共有可能イメージを作成する場合には,SYMBOL_VECTORオプションの最初のエントリとしてSPAREキーワードを指定することにより,シンボル・ベクタの最初のエントリを空にしておかなければなりません。VESTは,トランスレートされた VAXイメージ内で最初のシンボル・ベクタ・エントリを独自の目的で使用します。 |
次の例では,例 10-2 のソース・モジュールからネイティブな共有可能イメージを作成します。
$ LINK/SHAREABLE MYMATH.OBJ,SYS$INPUT/OPT GSMATCH=LEQUAL,1,1000 (1) SYMBOL_VECTOR=(SPARE,- myadd=procedure,- (2) mysub=procedure,- mydiv=procedure,- mymul=procedure) [Ctrl/Z] |
これらのシンボル・ベクタでのシンボルのオフセットを決定する方法についてと,レイアウトを一致するように制御する方法については,第 10.3.1 項 を参照してください。
トランスレートされたメイン・イメージ(MYMAIN_TV.EXE)は,トランスレートされた VAX共有可能イメージ,MYMATH_TV.EXEと組み合わせて実行でき,また,ネイティブなAlpha共有可能イメージ,MYMATH.EXEと組み合わせて実行することもできます。省略時の設定では,トランスレートされた実行可能イメージはトランスレートされた共有可能イメージを呼び出します(トランスレートされた実行可能イメージには,トランスレートされた共有可能イメージを示すグローバル・イメージ・セクション・ディスクリプタ [GISD] が含まれています。イメージ・アクティベータは,そのイメージがリンクされている共有可能イメージを起動します)。
トランスレートされたメイン・イメージをネイティブな共有可能イメージと組み合わせて実行するには,共有可能イメージMYMATH_TVの名前を,ネイティブなAlpha共有可能イメージ,MYMATH.EXEの位置を指す論理名として定義します。次の例を参照してください。
$ DEFINE MYMATH_TV YOUR_DISK:[YOUR_DIR]MYMATH.EXE $ RUN MYMAIN_TV |
段階的なシステム移行に際して,トランスレートされたVAX共有可能イメージに代わって用いるネイティブなAlpha共有可能イメージを作成するには,共有可能イメージ内のユニバーサル・シンボルが両方のイメージでシンボル・ベクタ内の同じオフセットに設定されるようにしなければなりません。VAX共有可能イメージをトランスレートする場合,VESTは元のVAX共有可能イメージで宣言されたユニバーサル・シンボルを含むシンボル・ベクタをイメージに対して作成します(トランスレートされたイメージは実際には,VESTが作成するAlphaイメージであり,他のAlpha共有可能イメージと同様にシンボル・ベクタにユニバーサル・シンボルが登録されています)。トランスレートされた共有可能イメージと互換性のあるネイティブな共有可能イメージを作成するには,ネイティブなAlpha共有可能イメージと,それに対応するトランスレートされた VAX共有可能イメージの両方で,同じシンボルがシンボル・ベクタ内の同じオフセットに登録されていなければなりません。
VESTがトランスレートされたVAXイメージ内で作成するシンボル・ベクタをレイアウトする方法を制御するには,シンボル・インフォメーション・ファイル(SIF)を作成し,トランスレーション操作をそのファイルを参照しながら行います。SIFファイルはテキスト・ファイルであり,このファイルを使用すれば,トランスレートされたイメージに対してVESTが作成するシンボル・ベクタ内のエントリのレイアウトを指定でき,どのシンボルを,トランスレートされた共有可能イメージのグローバル・シンボル・テーブル(GST)に登録しなければならないかも指定できます。シンボル・ベクタのレイアウトを指定しなかった場合には,VESTは共有可能イメージの再トランスレーションでレイアウトを変更する可能性があります。VESTは独自の目的で使用するために,最初のシンボル・ベクタ・エントリを確保します。シンボル・インフォメーション・ファイル(SIF)についての詳しい説明は,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。
ネイティブな共有可能イメージ内でシンボル・ベクタのレイアウトを制御するには,SYMBOL_VECTORオプションを指定します。リンカはSYMBOL_VECTORオプション文にシンボルが指定されている順序と同じ順序でシンボル・ベクタ内にエントリをレイアウトします。SYMBOL_VECTORオプションにシンボルを指定する場合には,VAX共有可能イメージを作成するために使用した転送ベクタ内でのシンボルの順序と同じ順序になるようにしてください。SYMBOL_VECTORオプションの使い方についての詳しい説明は,『OpenVMS Linker Utility Manual』を参照してください。
トランスレートされた共有可能イメージのシンボル・ベクタがネイティブな共有可能イメージのシンボル・ベクタと一致するかどうかを確認するには,次の操作を実行します。
/SIF修飾子を指定した場合には,VESTはシンボル・ベクタの内容をリストとして登録したSIFファイルを作成します (SIFファイルの作成と解釈方法については,『『DECmigrate for OpenVMS AXP Systems Translating Images』』を参照してください)。次の例は,共有可能イメージMYMATH.EXEに対して,VESTが作成したSIFファイルを示しています。エントリがシンボル・ベクタ内の番目の位置から始まっていることに注意してください(オフセットは16進数の10)。
! .SIF Generated by VEST (V1.0) on ! Image "MYMATH", "V1.0" MYDIV 00000017 +S +G 00000030 00 4e MYSUB (1) 0000000c +S +G 00000020 (2) 00 4e MYADD 00000008 +S +G 00000010 00 4e MYMUL 00000010 +S +G 00000040 00 4e |
ネイティブな共有可能イメージでシンボル・ベクタ内のシンボルのオフセットを判断するには,ANALYZE/IMAGEユーティリティを使用します。次の例は共有可能イメージMYMATH.EXEの解析から抜粋したものであり,MYSUBというシンボルのオフセットを示しています。
. . . 4) Universal Symbol Specification (EGSD$C_SYMG) data type: DSC$K_DTYPE_Z (0) symbol flags: (0) EGSY$V_WEAK 0 (1) EGSY$V_DEF 1 (2) EGSY$V_UNI 1 (3) EGSY$V_REL 1 (4) EGSY$V_COMM 0 (5) EGSY$V_VECEP 0 (6) EGSY$V_NORM 1 psect: 0 value: 16 (%X'00000020') symbol vector entry (procedure) %X'00000000 00010000' %X'00000000 00000050' symbol: "MYSUB" . . . |
SIFファイルに登録されているオフセットがネイティブな共有可能イメージのオフセットと一致しない場合には,テキスト・エディタを使用して,これらのオフセットを修正しなければなりません。シンボル・ベクタの最初のエントリは VESTユーティリティが使用するために確保されています。
このトランスレーション操作で,VEST は SIF ファイルに指定されたオフセットを使用して,トランスレートされたイメージにシンボル・ベクタを作成します。VESTはデフォルトのデバイスおよびディレクトリからSIFファイルを検索します (VESTユーティリティの使い方については,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください)。
前へ | 次へ | 目次 | 索引 |