OpenVMS AXP
オペレーティング・システム
OpenVMS AXP オペレーティング・システムへの移行:
再コンパイルと再リンク


前へ 次へ 目次 索引



第 6 章
ネイティブなイメージとトランスレートされたイメージの間の相互操作性の確認

この章では,トランスレートされた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イメージを作成するには,次の操作を実行します。

  1. VAX共有可能イメージをトランスレートします

    VESTを使用してVAXイメージをトランスレートする方法については,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。

  2. メイン・プログラムのネイティブなAXPバージョンを作成します

    OpenVMS AXPコンパイラを使用し,コマンド・ラインに /TIE修飾子を指定して,ソース・モジュールをコンパイルします。

  3. ネイティブなオブジェクト・モジュールをトランスレートされた VAX共有可能イメージとリンクします

    他の共有可能イメージの場合と同様に,リンカ・オプション・ファイルにトランスレートされたイメージを指定します。

相互操作性について説明するために,例 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共有可能イメージを作成するには,次の操作を実行します。

  1. VAX共有可能イメージをトランスレートします

    最終的には,共有可能イメージのVAXバージョンをネイティブ・バージョンに置き換えますが,この時点ではVESTインターフェイス情報ファイル(IIF)を作成するために共有可能イメージをトランスレートしなければなりません。VESTは共有可能イメージを呼び出すイメージをトランスレートするときに,共有可能イメージに関連するIIFを必要とします。IIFファイルについての説明と,VAXイメージをトランスレートするためにVESTを使用する方法については,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください(トランスレートされた共有可能イメージ内でシンボル・ベクタのレイアウトを制御するには,この処理を繰り返さなければなりません。詳しくは 第 6.3.1 項 を参照してください)。

  2. 共有可能イメージを呼び出すVAX実行可能イメージをトランスレートします

  3. 共有可能イメージのネイティブなAXPバージョンを作成します

    AXPコードを生成するコンパイラを使用してソース・モジュールをコンパイルします。そのとき,コマンド・ラインに/TIE修飾子を指定します。

  4. オブジェクト・モジュールをリンクして,ネイティブな AXP共有可能イメージを作成します

    共有可能イメージでユニバーサル・シンボルを宣言するために,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]
     
    

    1. 共有可能イメージのメジャー識別番号とマイナー識別番号を指定します。これらの識別番号の値は,VAX共有可能イメージに指定した値と一致しなければなりません(GSMATCHオプションの使い方についての説明は『OpenVMS Linker Utility Manual』を参照してください)。

    2. 共有可能イメージでユニバーサル・シンボルを指定します。

  5. ネイティブなAXPイメージのシンボル・ベクタのレイアウトは,トランスレートされたVAXイメージのシンボル・ベクタのレイアウトと一致しなければなりません

    これらのシンボル・ベクタでのシンボルのオフセットを決定する方法についてと,レイアウトを一致するように制御する方法については,第 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


前へ 次へ 目次 索引