前へ | 次へ | 目次 | 索引 |
この章では,トランスレートされたVAXイメージとの間で呼び出しを実行できるネイティブなAXPイメージの作成方法について説明します。
6.1 概要
『DECmigrate for OpenVMS AXP Systems Translating Images』では,VAX Environment Software Translator(VEST)を使用して,VAXの実行可能イメージまたは共有可能イメージを,それと同じ機能を実行するAXPイメージに変換する方法を説明しています(DECmigrate for OpenVMS AXPはオプションとして提供されるレイヤード・プロダクトであり,VAXアプリケーションをAXPシステムに移行するのに必要なサポートを提供します。VESTはDECmigrateユーティリティの構成要素です)。
VESTを使用すれば,アプリケーションのすべての構成要素をトランスレートできます。たとえば,メインの実行可能イメージや,それを呼び出すすべての共有可能イメージをトランスレートできます。さらに,トランスレートされた部分とネイティブな部分が混在するアプリケーションも作成できます。たとえば,ネイティブ・イメージの高い性能を利用できるように,共有可能イメージのネイティブ・バージョンを作成し,それをトランスレートされたアプリケーションから呼び出すことができます。また,ネイティブな部分とトランスレートされた部分が混在するアプリケーションを作成しておき,その後で,段階的にアプリケーションのネイティブ・バージョンを作成することもできます。
トランスレートされたVAXイメージはネイティブなAXPイメージと同様に使用できます。しかし,トランスレートされたイメージと相互操作可能なネイティブ・イメージを作成するには,この後の節に説明するように,特別な考慮が必要です。
6.1.1 トランスレートされたイメージと相互操作可能なネイティブ・イメージのコンパイル
トランスレートされたイメージとの間で呼び出しが可能なネイティブ・イメージを作成するには,ネイティブなAXPイメージのソース・ファイルをコンパイルするときに /TIE修飾子を指定しなければなりません。外部の呼び出しモジュールから使用できるプロシージャを含むソース・モジュールは,/TIE修飾子を使用してコンパイルしなければなりません。/TIE修飾子を指定する場合には,トランスレートされたイメージとネイティブ・イメージの間で正しく呼び出しができるように,コンパイラは実行時にTranslated Image Environment(TIE)が必要とするプロシージャ・シグナチャ・ブロック(PSB)を作成します。TIEはオペレーティング・システムの一部です。
トランスレートされたイメージ内に存在する可能性のあるコールバック(つまり,指定されたプロシージャの呼び出し)を実行するプロシージャを含むソース・モジュールをコンパイルする場合にも,/TIE修飾子を指定しなければなりません。この場合には,/TIE修飾子を指定すると,コンパイラは特殊なランタイム・ライブラリ・ルーチンOTS$CALL_PROCに対する呼び出しを生成し,トランスレートされたプロシージャへの外部呼び出しが正しく処理されるようにします。
/TIE修飾子の他にも,トランスレートされたイメージとネイティブな共有可能イメージの間で正しく相互操作できるように,他のコンパイラ修飾子も指定しなければならないことがあります。たとえば,トランスレートされたイメージからネイティブな共有可能イメージを呼び出すときに,呼び出し側が倍精度浮動小数点演算のために VAXの D浮動小数点形式を使用する場合(VAX用のコンパイラの省略時の設定),AXPシステムでは,倍精度データの省略時の形式はVAXの D浮動小数点ではないため,/FLOAT=D_FLOAT修飾子を指定しなければなりません。VAXの D浮動小数点形式を指定するための正確な修飾子の構文については,各コンパイラの解説書を参照してください。VAX のD浮動小数点データ型はAlpha AXPアーキテクチャではサポートされないため,このデータ型を使用すると,性能が低下する可能性があります。
さらにアプリケーション固有のセマンティックに応じて,バイト粒度やデータ・アラインメント,ASTの不可分性などを強制的に設定するために,他のコンパイラ修飾子を指定しなければならない場合もあります。
6.1.2 トランスレートされたイメージと相互操作可能なネイティブ・イメージのリンク
トランスレートされたVAXイメージを呼び出すことができるネイティブなAXPイメージを作成するには,/NONATIVE_ONLY修飾子を指定してネイティブなオブジェクト・モジュールをリンクしなければなりません(/NONATIVE_ONLYはこの修飾子に対してリンカが使用する省略時の設定です)。この修飾子を指定すると,リンカは,コンパイラが作成したPSB情報をイメージに挿入します。
/NATIVE_ONLY修飾子はネイティブ・イメージからトランスレートされたイメージへの呼び出しにのみ影響を与えるため,トランスレートされたVAXイメージから呼び出されるネイティブなAXPイメージを作成する場合には,この修飾子を指定する必要はありません。リンカの/NATIVE_ONLY修飾子は,ネイティブ・イメージからトランスレートされたイメージを呼び出すことを禁止することになりますが,トランスレートされたイメージからネイティブ・イメージが呼び出されるのを防げるものではありません。
段階的なシステム移行に際して,共有可能イメージのネイティブ・バージョンのシンボル・ベクタのレイアウトは,トランスレートされた共有可能イメージのシンボル・ベクタのレイアウトと一致しなければなりません。トランスレートされた共有可能イメージをネイティブな共有可能イメージに置き換えることについての詳しい説明は,第 6.3 節 を参照してください。
6.2 トランスレートされたイメージの呼び出しが可能なネイティブ・イメージの作成
トランスレートされたVAX共有可能イメージを呼び出すことができるネイティブなAXPイメージを作成するには,次の操作を実行します。
VESTを使用してVAXイメージをトランスレートする方法については,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。
OpenVMS AXPコンパイラを使用し,コマンド・ラインに /TIE修飾子を指定して,ソース・モジュールをコンパイルします。
他の共有可能イメージの場合と同様に,リンカ・オプション・ファイルにトランスレートされたイメージを指定します。
相互操作性について説明するために,例 6-1 と 例 6-2 に示したプログラムについて考えてみましょう。例 6-1 は,例 6-2 に定義されているmysubというルーチンを呼び出します。
例 6-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); } |
例 6-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コンパイラを使用してソース・モジュールをコンパイルします。共有可能イメージとして 例 6-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ページのAXPイメージに集めなければなりません。保護属性が矛盾する隣接イメージ・セクションをVESTが同じAXPページに集める場合,すべてのイメージ・セクションに対して,もっともゆるやかな保護を割り当て,警告を出します(/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をネイティブ・バージョンと置き換えるには,AXPコードを生成するコンパイラを使用して 例 6-1 に示したソース・モジュールをコンパイルします。そのとき,コンパイル・コマンド・ラインに/TIE修飾子を指定します。その後,ネイティブ・オブジェクト・モジュールMYMAIN.OBJをリンクして,ネイティブな AXPイメージを作成します。次の例に示すように,他の共有可能イメージをリンクするときと同様に,トランスレートされた共有可能イメージをリンカ・オプション・ファイルに指定してください。
$ LINK/NONATIVE_ONLY MYMAIN.OBJ,SYS$INPUT/OPT MYMATH_TV.EXE/SHAREABLE [Ctrl/Z] |
(/NONATIVE_ONLYは省略時の設定であるため,この修飾子を特に指定する必要はありません。)
ネイティブなメイン・イメージは他のAXPイメージと同様に実行できます。トランスレートされた共有可能イメージの名前(MYMATH_TV)を,トランスレートされた共有可能イメージの位置を示す論理名として定義し(論理名SYS$SHAREによって示されるディレクトリに登録されていない場合),RUNコマンドを実行します。次の例を参照してください。
$ DEFINE MYMATH_TV YOUR$DISK:[YOUR_DIR]MYMATH_TV.EXE $ RUN MYMAIN |
6.3 トランスレートされたイメージから呼び出すことができるネイティブ・イメージの作成
トランスレートされたVAXイメージから呼び出すことができるネイティブな AXP共有可能イメージを作成するには,次の操作を実行します。
最終的には,共有可能イメージのVAXバージョンをネイティブ・バージョンに置き換えますが,この時点ではVESTインターフェイス情報ファイル(IIF)を作成するために共有可能イメージをトランスレートしなければなりません。VESTは共有可能イメージを呼び出すイメージをトランスレートするときに,共有可能イメージに関連するIIFを必要とします。IIFファイルについての説明と,VAXイメージをトランスレートするためにVESTを使用する方法については,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください(トランスレートされた共有可能イメージ内でシンボル・ベクタのレイアウトを制御するには,この処理を繰り返さなければなりません。詳しくは 第 6.3.1 項 を参照してください)。
AXPコードを生成するコンパイラを使用してソース・モジュールをコンパイルします。そのとき,コマンド・ラインに/TIE修飾子を指定します。
共有可能イメージでユニバーサル・シンボルを宣言するために,SYMBOL_VECTORオプションを使用します。互換性を維持するために,VAX共有可能イメージで宣言した順序と同じ順序で,SYMBOL_VECTORオプションにユニバーサル・シンボルを宣言します。
トランスレートされたVAX共有可能イメージと置換するために,ネイティブな AXP共有可能イメージを作成する場合には,SYMBOL_VECTORオプションの最初のエントリとしてSPAREキーワードを指定することにより,シンボル・ベクタの最初のエントリを空にしておかなければなりません。VESTは,トランスレートされた VAXイメージ内で最初のシンボル・ベクタ・エントリを独自の目的で使用します。 |
次の例では,例 6-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] |
これらのシンボル・ベクタでのシンボルのオフセットを決定する方法についてと,レイアウトを一致するように制御する方法については,第 6.3.1 項 を参照してください。
トランスレートされたメイン・イメージ(MYMAIN_TV.EXE)は,トランスレートされた VAX共有可能イメージ,MYMATH_TV.EXEと組み合わせて実行でき,また,ネイティブなAXP共有可能イメージ,MYMATH.EXEと組み合わせて実行することもできます。省略時の設定では,トランスレートされた実行可能イメージはトランスレートされた共有可能イメージを呼び出します(トランスレートされた実行可能イメージには,トランスレートされた共有可能イメージを示すグローバル・イメージ・セクション・ディスクリプタ(GISD)が含まれています。イメージ・アクティベータは,そのイメージがリンクされている共有可能イメージを起動します)。
トランスレートされたメイン・イメージをネイティブな共有可能イメージと組み合わせて実行するには,共有可能イメージMYMATH_TVの名前を,ネイティブなAXP共有可能イメージ,MYMATH.EXEの位置を指す論理名として定義します。次の例を参照してください。
$ DEFINE MYMATH_TV YOUR_DISK:[YOUR_DIR]MYMATH.EXE $ RUN MYMAIN_TV |
前へ | 次へ | 目次 | 索引 |