この章では, トランスレートされたVAXイメージとの間で呼び出しを実行できるネイティブな Alphaイメージの作成方法について説明します。
『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イメージと同様に使用できます。 しかし,トランスレートされたイメージと相互操作可能なネイティブ・イメージを作成するには, この後の節に説明するように,特別な考慮が必要です。
トランスレートされたイメージとの間で呼び出しが可能なネイティブ・イメージを作成するには, ネイティブな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の不可分性などを強制的に設定するために, 他のコンパイラ修飾子を指定しなければならない場合もあります。
トランスレートされたVAXイメージを呼び出すことができるネイティブな Alphaイメージを作成するには, /NONATIVE_ONLY修飾子を指定してネイティブなオブジェクト・モジュールをリンクしなければなりません (/NONATIVE_ONLYはこの修飾子に対してリンカが使用する省略時の設定です)。 この修飾子を指定すると,リンカは, コンパイラが作成したPSB情報をイメージに挿入します。
/NATIVE_ONLY修飾子はネイティブ・イメージからトランスレートされたイメージへの呼び出しにのみ影響を与えるため, トランスレートされたVAXイメージから呼び出されるネイティブなAlphaイメージを作成する場合には, この修飾子を指定する必要はありません。 リンカの省略時の動作(/NATIVE_ONLY修飾子)は, ネイティブ・イメージからトランスレートされたイメージを呼び出すことを禁止することになりますが, トランスレートされたイメージからネイティブ・イメージが呼び出されるのを防げるものではありません。
段階的なシステム移行に際して, 共有可能イメージのネイティブ・バージョンのシンボル・ベクタのレイアウトは, トランスレートされた共有可能イメージのシンボル・ベクタのレイアウトと一致しなければなりません。 トランスレートされた共有可能イメージをネイティブな共有可能イメージに置き換えることについての詳しい説明は, 第10.3節を参照してください。
トランスレートされたVAX共有可能イメージを呼び出すことができるネイティブな Alphaイメージを作成するには,次の操作を実行します。
VESTを使用してVAXイメージをトランスレートする方法については, 『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。
ネイテイブなAlphaコードを作成するコンパイラを使用し, コマンド・ラインに/TIE修飾子を指定して,ソース・モジュールをコンパイルします。
他の共有可能イメージの場合と同様に, リンカ・オプション・ファイルにトランスレートされたイメージを指定します。
#include <stdio.h> int mysub(); main() { int num1, num2, result; num1 = 5; num2 = 6; result = mysub( num1, num2 ); printf("Result is: %d\n", result); }
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
トランスレートされた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オプションにユニバーサル・シンボルを宣言します。
次の例では,例 10-2 のソース・モジュールからネイティブな共有可能イメージを作成します。
- 注意
- トランスレートされたVAX共有可能イメージと置換するために, ネイティブなAlpha共有可能イメージを作成する場合には, SYMBOL_VECTORオプションの最初のエントリとして SPAREキーワードを指定することにより, シンボル・ベクタの最初のエントリを空にしておかなければなりません。VESTは, トランスレートされた VAXイメージ内で最初のシンボル・ベクタ・エントリを独自の目的で使用します。
$ 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]
【1】 | 共有可能イメージのメジャー識別番号とマイナー識別番号を指定します。 これらの識別番号の値は, VAX共有可能イメージに指定した値と一致しなければなりません (GSMATCHオプションの使い方についての説明は 『OpenVMS Linker Utility Manual』を参照してください)。 |
【2】 | 共有可能イメージでユニバーサル・シンボルを指定します。 |
これらのシンボル・ベクタでのシンボルのオフセットを決定する方法についてと, レイアウトを一致するように制御する方法については, 第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
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 00000018 +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
【1】 | ユニバーサル・シンボルMYSUBに対するエントリ |
【2】 | トランスレートされたイメージのシンボル・ベクタ内での MYSUBに対するエントリのオフセット |
ネイティブな共有可能イメージでシンボル・ベクタ内のシンボルのオフセットを判断するには, 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』を参照してください)。
場合によっては,VAX共有可能イメージを Alpha共有可能イメージに完全に置き換えることができない場合があります。たとえば, VAX共有可能イメージでVAXアーキテクチャ固有の機能を使用している場合などです。 このような場合には,元のVAX共有可能イメージの機能を実行できるように, トランスレートされたイメージとネイティブ・イメージの両方を作成しなければなりません。 また,場合によっては,トランスレートされたVAX共有可能イメージと新しい Alpha共有可能イメージとの間に関係を定義しなければならないことがあります。 どちらの場合にも,トランスレートされたVAXイメージは ジャケット・イメージとして作成されなければなりません。
ジャケット・イメージを作成するには, VAXシステムで新しいAlphaイメージの代用バージョンを作成します。その後, 変更されたVAX共有可能イメージを作成し,/JACKET=shrimg修飾子を指定して, この共有可能イメージをトランスレートします。ただし, shrimgは新しいAlpha共有可能イメージの名前です。 代用イメージのトランスレーションは前もって実行しておかなければなりません。 これは,代用イメージを記述するIIFファイルが必要だからです。 代用イメージの作成についての詳しい説明は,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。