日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページサイズの拡大に対するアプリケーションの対応
第 6 章:共用データの整合性の維持
第 7 章:アプリケーションデータ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:OpenVMS I64コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム

OpenVMS
OpenVMS VAX から OpenVMS I64 への
アプリケーションの移行


目次 索引

第 4 章
再コンパイルと再リンクの概要

この章では,アプリケーションを構成するソース・ファイルを再コンパイルおよび再リンクすることにより, VAX システム上で動くアプリケーションを I64 システムに移行するプロセスについて,その概要を説明します。

一般に,アプリケーションが高級プログラミング言語で作成されている場合には,わずかな作業で I64 システムで実行できるようになります。高級言語では,アプリケーションを下位のマシン・アーキテクチャへの依存から分離します。さらに,I64 システム上のプログラミング環境のほとんどの部分は, VAX システムのプログラミング環境と同じです。 I64 版の各言語のコンパイラと OpenVMS リンカ・ユーティリティ (linker) を使用すれば,アプリケーションを構成するソース・ファイルを再コンパイルおよび再リンクして,ネイティブ I64 イメージを作成できます。

アプリケーションが VAX MACRO で作成されている場合は,最低限の作業だけで I64 システム上でも実行できる可能性があります。ただし一般には,VAX のアーキテクチャに依存する何らかの要素が含まれており,それに応じた変更を加えなければなりません。

内部モードや高い割り込み優先順位レベル (IPL) で動作する特権アプリケーションは,コード内でオペレーティング・システムの内部的な動作に関するさまざまな仮定を行っているので,大幅な書き換えが必要になります。一般に,このようなアプリケーションは OpenVMS VAX オペレーティング・システムのメジャー・リリースのたびに大幅な変更を加える必要が生じます。

注意

高級言語で作成されたアプリケーションであっても,アーキテクチャ固有の機能に依存することがあります。また,新しいプラットフォームへの移行の際に,アプリケーション内の隠れたバグが表面化することもあります。



ネイティブ I64 コンパイラで再コンパイルする前に,まず VAX で動作するコードを最新版のコンパイラでコンパイルすることをお勧めします。これにより,コンパイラのバージョンの変更に起因する問題が見つかる可能性があります。たとえば,新しいバージョンのコンパイラでは,以前は無視されていたプログラミング言語標準への準拠が強制され,アプリケーション・コード中の潜在的な問題が見つかる場合があります。また,新しいバージョンのコンパイラでは,以前のバージョンを作成した時点では有効でなかった標準への準拠が適用されることもあります。 OpenVMS VAX 上でこのような問題を修正することで, I64 へのアプリケーションのポーティングが簡単になります。

4.2 ネイティブ I64 コンパイラによるアプリケーションの再コンパイル

VAX システムでサポートされる言語の多くは,I64 システムでもサポートされます。たとえば Fortranや C などです。 I64 システムで使用できる一般的なプログラミング言語のコンパイラについての詳細は, 第 9 章 を参照してください。

I64 システムで使用できるコンパイラは,それぞれ VAX システムの対応するコンパイラと互換性を維持するように設計されています。各コンパイラは言語標準規格に準拠し,VAX の言語拡張機能の大部分をサポートします。コンパイラは,VAX システムの場合と同じデフォルトのファイル・タイプで出力ファイルを作成します。たとえば,オブジェクト・モジュールのファイル・タイプは .OBJ です。

OpenVMS I64 コンパイラの一覧については, 第 3.2.1.1 項 を参照してください。

しかし,VAX システムのコンパイラがサポートしている一部の機能は, I64 システムの同じコンパイラでサポートされません。さらに,I64 システムのいくつかのコンパイラは, VAX システムの対応するコンパイラがサポートしていない新機能をサポートしています。互換性を維持するために,一部のコンパイラは互換モードをサポートしています。たとえば,OpenVMS I64 システム用の HPE C コンパイラは VAX C 互換モードをサポートしています。このモードは /STANDARD=VAXC 修飾子を指定することにより起動されます。

VAX アプリケーションがかなり前に作成された場合,特に古いコンパイラで作成された場合は,移行の準備として,最新版のコンパイラで再作成することをお勧めします。 I64 コンパイラは,古いコンパイラよりも,最新の VAX コンパイラと機能的に互換性があります。

4.3 I64 システムでのアプリケーションの再リンク

ソース・ファイルを正しく再コンパイルした後,アプリケーションを再リンクしてネイティブ I64 イメージをビルドしなければなりません。リンカは現在の VAX システムと同じファイル・タイプで出力ファイルを生成します。たとえば,デフォルトでは,リンカはイメージ・ファイルのファイル・タイプとして .EXE を使用します。

I64 システムではある種のリンク作業を実行する方法が異なるため,アプリケーションをビルドするために使用する LINK コマンドを変更しなければなりません。以下のリストは,アプリケーションのビルド手順に影響を与える可能性のある,リンカの変更点を示します。詳細は,『OpenVMS Linker Utility Manual』を参照してください。

  • 共有イメージ内でのユニバーサル・シンボルの宣言--- アプリケーションが共有イメージを作成する場合には,おそらくアプリケーションのビルド・プロシージャに VAX MACRO で作成された転送ベクタ・ファイルが含まれており,共有イメージ内のユニバーサル・シンボルが宣言されています。 I64 システムでは,転送ベクタ・ファイルを作成する代わりに,オプション SYMBOL_VECTOR=option を指定することにより,リンカ・オプション・ファイルでユニバーサル・シンボルを宣言しなければなりません。

  • OpenVMS エグゼクティブに対するリンク--- VAX システムでは,ビルド・プロシージャにシステム・シンボル・テーブル・ファイル (SYS.STB) をインクルードすることにより,OpenVMS エグゼクティブに対してリンクします。 I64 システムでは,/SYSEXE 修飾子を指定することにより, OpenVMS エグゼクティブに対してリンクします。

  • 共有イメージの暗黙の処理--- I64 システムでは,イメージが直接呼び出す共有イメージを,ビルド・プロシージャで指定しなければなりません。
    VAX システムでは,共有イメージとリンクされるイメージの一覧が,リンカによってイメージの依存関係リストに設定されます。たとえば,メイン・イメージを LIBRTL.EXE に対してリンクし,LIBRTL.EXE を LIBOTS.EXE に対してリンクする場合,メイン・イメージが直接 LIBOTS.EXE を呼び出していなくても,LIBRTL と LIBOTS の両方がメイン・イメージの依存関係リスト (共有イメージ・リストとも呼ばれます) に設定されます。 LIBOTS が互換性のない方法で変更された場合は,メイン・イメージを再リンクしなければなりません。
    I64 システムでは,直接リンクしたイメージだけがリンカによってイメージの依存関係リストに設定されます。 I64 で,イメージを LIBRTL.EXE に対してリンクし,LIBRTL.EXE が LIBOTS.EXE に対してリンクされている場合,メイン・イメージの依存関係リストには,LIBRTL だけが設定されます。 LIBOTS.EXE が互換性のない方法で変更された場合, LIBRTL.EXE は再リンクする必要がありますが,メイン・イメージは再リンクの必要はありません。

  • ベースが指定されていないクラスタ--- VAX では,CLUSTER オプションでベース・アドレスを指定することができます。しかし,I64 では,CLUSTER オプションでベース・アドレスを指定することはできません。 表 4-2 の CLUSTER= オプションの説明を参照してください。

  • OpenVMS I64 では初期化されたオーバレイ・プログラム・セクションの扱いが異なる--- VAX システムではオーバレイ・プログラム・セクションのさまざまな部分に対して初期化を実行することができます。同じ部分に対して再度初期化を行うと,以前のモジュールによる初期化が上書きされます。リンクするイメージのそれぞれのバイトについて,それに対して実行された最後の初期化が,各バイトごとの最終的な内容になります。 I64 システムで初期化を行うと,セクション全体がコンパイラで初期化されます。このセクションに対する以降の初期化は,新しい初期化内容が既存の内容と同じ場合にだけ実行できます。

リンカは,I64 システム固有のさまざまな修飾子とオプションをサポートします。これらの修飾子を 表 4-1 に示します。 表 4-2 は,VAX システムではサポートされ, I64 システムではサポートされないリンカ修飾子を示しています。 表 4-3 は,VAX システムではサポートされ, I64 システムでは無視されるリンカ修飾子を示しています。

表 4-1 OpenVMS I64 システム固有のリンカ修飾子とオプション
修飾子 説明
/DEMAND_ZERO[=PER_PAGE] 実行イメージと共有イメージの両方で,デマンド・ゼロ・イメージ・セクション (OpenVMS I64 ではセグメントと呼ばれる) を有効にする。キーワード PER_PAGE を指定すると,各セグメントの後続のゼロが圧縮される (後続ページのゼロのデマンド・ゼロ圧縮)
/DSF OpenVMS I64 デバッガで使用するために,デバッグ・シンボル・ファイル (DSF) と呼ぶファイルを作成するようにリンカに要求する。
/FP_MODE=keyword OpenVMS I64 リンカは,プログラムの初期浮動小数点モードを,メイン遷移アドレスを提供するモジュールの浮動小数点モードを使用して決定する。 /FP_MODE 修飾子は,メイン遷移アドレスを提供するモジュールが初期浮動小数点モードを持たない場合にだけ,初期浮動小数点モードを設定するために使用する。 /FP_MODE 修飾子は,メイン遷移モジュールによって提供される初期浮動小数点モードを指定変更することはない。
/FULL[=( keyword [,...])] キーワード GROUP_SECTIONS は,マップで使用されているすべてのグループを出力する ( グループは OpenVMS I64 用のオブジェクト言語の新しい概念。詳細は,『OpenVMS Linker Utility Manual』を参照)。キーワード NOSECTION_DETAILS は, OpenVMS I64 リンカが長さゼロのコントリビューションをマップのプログラム・セクション一覧に表示しない場合に指定する。デフォルトは /FULL=SECTION_DETAILS。
/GST 共有イメージのグローバル・シンボル・テーブル (GST) を作成することをリンカに要求する (デフォルト)。通常は,リンクできない共有イメージとともにアプリケーションを出荷する場合に, /NOGST として指定する。
/INFORMATIONALS リンク操作で情報メッセージを出力することをリンカに要求する(デフォルト)。 /NOINFORMATIONALS を指定する方が一般的であり,その場合には情報メッセージは出力されない。
/NATIVE_ONLY 作成しているイメージに,コンパイラが作成したプロシージャ・シグネチャ・ブロック (PSB) 情報を渡さないようにリンカに要求する (デフォルト)。

リンク時に /NONATIVE_ONLY を指定した場合には,イメージ・アクティベータは,ジャケット・ルーチンを起動するために,リンク操作に対する入力ファイルとして指定されたオブジェクト・モジュールで提供された PSB 情報を使用する。ネイティブ I64 イメージが,トランスレートされたイメージと連携動作するためには,ジャケット・ルーチンが必要である。

/SEGMENT_ATTRIBUTE=( segment_attribute
[, ...])
OpenVMS I64 リンカに対して,セグメントの特定の属性を設定するように指示する。 OpenVMS I64 リンカでは,セグメント属性として,DYNAMIC=address_region, SHORT=WRITE,CODE=address_region,および SYMBOL_VECTOR=[NO]SHORT を指定できる。アドレス領域は,キーワード P0 および P2 を使用して指定できる。
/SYSEXE リンク操作で解決されなかったシンボルを解決するために, OpenVMS エグゼクティブ・イメージ (SYS$BASE_IMAGE.EXE) を処理することをリンカに要求する。
オプション 説明
SYMBOL_TABLE= option 共有イメージに関連するシンボル・テーブル・ファイルに,ユニバーサル・シンボルだけでなく,グローバル・シンボルも登録することをリンカに要求する。デフォルトでは,リンカはユニバーサル・シンボルだけを登録する。
SYMBOL_VECTOR= option I64 共有イメージでユニバーサル・シンボルを宣言するために使用する。

表 4-2 I64 システムではサポートされない OpenVMS VAX リンカ修飾子とオプション
修飾子 説明
/DEBUG=file_spec /DEBUG 修飾子でオブジェクト・ファイルを指定して,ユーザ作成デバッガ・モジュールを実行時にアクティブにする機能はサポートされない。
/SYSTEM[=base_address] システム・イメージを作成することをリンカに指示し,オプションで,イメージをメモリにロードするアドレスを指定することができる。システム・イメージを RUN コマンドでアクティブにすることはできない。ブートストラップするか,メモリにロードしなければならない。
オプション 説明
BASE= option リンカがイメージに割り当てる基底アドレス (開始アドレス) を指定する。
CLUSTER= cluster_name, base_address CLUSTER オプションでは基底アドレス・キーワードはヌルでなくてはならない。ベースが指定されたイメージ (ベース・イメージ・セクションがあるイメージ) は, I64 ではサポートされない。
UNIVERSAL= option 共有イメージ内のシンボルを,ユニバーサルとして宣言する。これによりリンカは,共有イメージの GST 内に登録する。

表 4-3 I64 システムでは無視される OpenVMS VAX リンカ修飾子とオプション
修飾子 説明
/ALPHA OpenVMS Alpha イメージを生成するようにリンカに指示する。
/HEADER /SYSTEM 修飾子と同時に指定すると,システム・イメージにイメージ・ヘッダを含めるようにリンカに指示する。 I64 リンカは,イメージに対して /HEADER 修飾子が指定された場合は無視する。 VAX リンカと Alpha リンカは,実行イメージまたは共有イメージに対して指定された場合に無視する。
/VAX OpenVMS VAX イメージを生成するようにリンカに指示する。
オプション 説明
DZRO_MIN= option イメージ・セクションからページを取り出し,新しく作成したデマンド・ゼロ・イメージ・セクションに配置する前に,イメージ・セクション内でリンカが探さなくてはならない,最低限の連続した初期化されていないページの数を指定する。デマンド・ゼロ・イメージ・セクション (初期化済みのデータが格納されていないイメージ・セクション) を作成することで,リンカはイメージのサイズを削減することができる。
ISD_MAX= option イメージ中に作成できるイメージ・セクションの最大数を指定する。



4.4 VAX システムと I64 システムの算術演算ライブラリ間の互換性

OpenVMS Mathematics (MTH$) ランタイム・ライブラリに対して標準的な VMS 呼び出しインタフェースを使用する算術演算アプリケーションを, OpenVMS I64 システムに移行するときには, MTH$ ルーチンの呼び出しを変更する必要はありません。これは,MTH$ ルーチンを Portable Mathematics Library (DPML) for OpenVMS I64 システムの対応する math$ に変換するためのジャケット・ルーチンが提供されているためです。ただし,JSB エントリ・ポイントとベクタ・ルーチンに対して実行される呼び出しは, DPML でサポートされません。 DPML ルーチンは OpenVMS MTH$ RTL のルーチンと異なっており,算術演算の結果の精度にわずかな違いが発生する可能性があります。

将来のライブラリとの互換性を維持し,移植可能な算術演算アプリケーションを開発するには,この呼び出しインタフェースを使用するのではなく,選択した高級言語 (たとえば HPE C や HPE Fortranなど) を通じて提供される DPML ルーチンを使用することをお勧めします。 DPML ルーチンを使用すれば,性能と精度も大幅に向上できます。

DPML ルーチンについての詳細は,『Compaq Portable Mathematics Library』を参照してください。

4.5 ホスト・アーキテクチャの判断

アプリケーションが OpenVMS VAX システムで実行されているのか, I64 システムで実行されているのかを,アプリケーションで判断しなければならないことがあります。プログラムの内部から $GETSYI システム・サービス (または LIB$GETSYI RTL ルーチン) を呼び出し, ARCH_TYPE 項目コードを指定すれば,この情報を入手できます。アプリケーションが VAX システムで実行されている場合には, $GETSYI システム・サービスは値 1 を返します。アプリケーションが I64 システムで実行されている場合には, $GETSYI システム・サービスは値 3 を返します。

例 4-1 は,F$GETSYI DCL コマンドを呼び出し, ARCH_TYPE 項目コードを指定することにより, DCL コマンド・プロシージャでホスト・アーキテクチャを判断する方法を示しています ($GETSYI システム・サービスを呼び出して I64 システムのページ・サイズを取得する例については, 第 5.4 節 を参照してください)。

例 4-1 アーキテクチャ・タイプを判断するための ARCH_TYPE キーワードの使用

$! Determine architecture type 
$ type_symbol = f$getsyi("arch_type") 
$ if type_symbol .eq. 1 then goto ON_VAX 
$ if type_symbol .eq. 2 then goto ON_ALPHA 
$ if type_symbol .eq. 3 then goto ON_I64 
$ ! 
$ ! Unknown architecture 
$ ! 
$ exit 
$ ON_VAX: 
$ ! 
$ ! Do VAX-specific processing 
$ ! 
$ exit 
$ ON_ALPHA: 
$ ! 
$ ! Do Alpha-specific processing 
$ ! 
$ exit 
$ ON_I64: 
$ ! 
$ ! Do I64-specific processing 
$ ! 
$ exit 

しかし,ARCH_TYPE 項目コードは,バージョン 5.5 またはそれ以降のバージョンを実行している VAX システムでしか使用できません。アプリケーションが,これ以前のバージョンのオペレーティング・システムでホスト・アーキテクチャを判断しなければならない場合には, 表 4-4 に示した $GETSYI システム・サービスの他の項目コードを使用しなければなりません。

表 4-4 ホスト・アーキテクチャを指定する$GETSYI 項目コード
キーワード 使用方法
ARCH_TYPE VAX システムでは 1 を返す。 Alpha システムでは2 を返す。 I64 システムでは 3 を返す。 I64 システムと,OpenVMS バージョン 5.5 以降のバージョンの VAX システムでサポートされる。
ARCH_NAME VAX システムでは "VAX" というテキスト文字列を返し, Alpha システムでは "Alpha" というテキスト文字列を返し, I64 システムでは "IA64" というテキスト文字列を返す。 I64 システムと,OpenVMS バージョン 5.5 以降のバージョンを実行している VAX システムでサポートされる。
HW_MODEL ハードウェア・モデルを識別する整数を返す。値 4096 は I64 システムを示す。
CPU 特定のCPU を識別する整数を返す。 128 という値は,システムを "VAX でない"として識別する。このコードは ARCH_TYPE コードおよび ARCH_NAME コード以前の OpenVMS のバージョンでサポートされる。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項