[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

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

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

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

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

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

    ネイテイブなAlphaコードを作成するコンパイラを使用し, コマンド・ラインに/TIE修飾子を指定して,ソース・モジュールをコンパイルします。

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

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

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

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

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

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

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

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

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

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

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

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

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


10.3.1 シンボル・ベクタ・レイアウトの制御

段階的なシステム移行に際して, トランスレートされた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』を参照してください。

トランスレートされた共有可能イメージのシンボル・ベクタがネイティブな共有可能イメージのシンボル・ベクタと一致するかどうかを確認するには, 次の操作を実行します。

  1. /SIF修飾子を指定してVAX共有可能イメージをトランスレートします

    /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に対するエントリのオフセット

  2. ネイティブな共有可能イメージ内でのシンボル・ベクタのオフセットを調べます

    ネイティブな共有可能イメージでシンボル・ベクタ内のシンボルのオフセットを判断するには, 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"
            .
            .
            .
    

  3. 必要に応じて,SIFファイルに登録されているオフセットを変更します

    SIFファイルに登録されているオフセットがネイティブな共有可能イメージのオフセットと一致しない場合には, テキスト・エディタを使用して,これらのオフセットを修正しなければなりません。 シンボル・ベクタの最初のエントリはVESTユーティリティが使用するために確保されています。

  4. VAX共有可能イメージを再トランスレートしますトランスレーション操作では, SIFファイルを参照してください

    このトランスレーション操作で,VESTはSIFファイルに指定されたオフセットを使用して, トランスレートされたイメージにシンボル・ベクタを作成します。 VESTはデフォルトのデバイスおよびディレクトリからSIFファイルを検索します (VESTユーティリティの使い方については, 『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください)。


10.3.2  特殊なトランスレートされたイメージ(ジャケット・イメージ) と代用イメージの作成

場合によっては,VAX共有可能イメージを Alpha共有可能イメージに完全に置き換えることができない場合があります。たとえば, VAX共有可能イメージでVAXアーキテクチャ固有の機能を使用している場合などです。 このような場合には,元のVAX共有可能イメージの機能を実行できるように, トランスレートされたイメージとネイティブ・イメージの両方を作成しなければなりません。 また,場合によっては,トランスレートされたVAX共有可能イメージと新しい Alpha共有可能イメージとの間に関係を定義しなければならないことがあります。 どちらの場合にも,トランスレートされたVAXイメージは ジャケット・イメージとして作成されなければなりません。

ジャケット・イメージを作成するには, VAXシステムで新しいAlphaイメージの代用バージョンを作成します。その後, 変更されたVAX共有可能イメージを作成し,/JACKET=shrimg修飾子を指定して, この共有可能イメージをトランスレートします。ただし, shrimgは新しいAlpha共有可能イメージの名前です。 代用イメージのトランスレーションは前もって実行しておかなければなりません。 これは,代用イメージを記述するIIFファイルが必要だからです。 代用イメージの作成についての詳しい説明は,『DECmigrate for OpenVMS AXP Systems Translating Images』を参照してください。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]