COBOL では、CBL_GET_PROGRAM_INFO は、COBOL プログラム用に定義された保存領域を使用します。COBOL ランタイム システムは、.int と .gnt をロードし、このようなタイプのプログラムに対して、関連する保存領域へのアクセスを提供します。
ただし、ネイティブ オブジェクト コードのプログラムは、COBOL ランタイム システムによってロードされているがまだ呼び出されていない状態になっていることがあります。呼び出されるまで、保存領域は存在しないため、ネイティブ オブジェクト コードのプログラム (共有オブジェクト、ダイナミック リンク ライブラリ、実行ファイル) で CBL_GET_PROGRAM_INFO を使用できません。
これを解決するには、コンパイラ (COBOL または PL/I) に基づいて、あらかじめ定義した構造体をプログラムの結果オブジェクトに埋め込むことができます。この構造体には既知のシンボルを含める必要があります。これにより、ランタイムが実行中にその構造体を容易に見つけることができます。ネイティブ オブジェクト コードのプログラムがロードされているがまだ実行されていない場合、またはオブジェクトが PL/I オブジェクトの場合、このシンボルを見つけることができ、埋め込まれた構造体からプログラム情報を抽出することができます。
コンパイラは、オブジェクト コードのプログラム用に以下の構造体を作成します。
struct
{
unsigned int version;
unsigned int flags;
union
{
void * p_savarea;
Unsigned int PLI_attributes;
}x;
} _mFinfo_<NAME>;
/* PLI_attributes bit values */
#define PLI_AMODE24 0x00000001
#define PLI_AMODE31 0x00000002
#define PLI_EBCDIC 0x00000004
#define RESERVED1 0x000000F8
#define LANGUAGE 0x00000700
#define LANGUAGE_SPECIFIC 0x01FFF800
#define PLI_LENDIAN 0x00000800
#define PLI_FUTURE 0x01FFF000
#define RESERVED2 0xFE000000
詳細は次のとおりです。
| <NAME> | メイン エントリ ポイントまたはメイン プログラムの名前 |
| version | 構造体のバージョン (初期設定値は 1) |
| flags |
0 = COBOL プログラム 1 = PL/I プログラム |
| p_savarea | COBOL プログラムの savarea へのポインター |
| PLI_attributes | 返される PL/I 属性 |
必要な場合にランタイムが _mFinfo_<NAME> シンボルを見つけることができるように、このシンボルを認識できるようにしておく必要があります。COBOL ランタイムでは、CBL_GET_PROGRAM_INFO は、指定されたプログラムが見つかったが保存領域が存在しない場合を除いて、通常通りに動作します。指定されたプログラムが見つかったが保存領域が存在しない状況で _mFinfo_<NAME> シンボルが見つかると、バージョンとフラグに基づいて、関連付けられた構造体が解読されます。COBOL の場合、プログラムの保存領域へのポインター (p_savarea) を使用して、指定したプログラムに関連するすべての情報にアクセスし、それらの情報を返すことができます。PL/I の場合、PLI_attributes データ項目から、関連するプログラム情報を抽出して返します。
PL/I の CBL_GET_PROGRAM_INFO では、COBOL プログラムの場合と同じようにプログラムの属性が返されます。PL/I プログラムに返されるビットの意味を次に示します。
CBL_GET_PROGRAM_INFO ルーチンでは、PL/I 言語を設定するようにビット 8-10 が変更され、非 COBOL を示すようにビット 31 が設定されます。残りのデータ項目は説明の通りに返されます。ビット 3-7 と 25-30 は、ビット 31 を適切にチェックしない既存のプログラムと競合しないよう予約されています。
スタック内の PL/I では、現在のプログラムの情報を取得した後、スタックを繰り返し処理して呼び出し元プログラムの情報を取得することはできません。