【PL/I学習|初心者向け】メインフレーム開発の落とし穴!STATIC EXTERNALと「名前のマングリング」を攻略しよう

1. 導入:なぜ名前の不一致でリンクエラーが起きるのか?

メインフレーム開発において、COBOLやアセンブラ、そしてC言語が混在する環境は珍しくありません。しかし、異なる言語間で変数を共有しようとすると、なぜか「シンボルが見つからない」という不可解なリンクエラーに遭遇することがあります。その原因の多くが「名前のマングリング(名前の切り詰めや変換)」です。本記事では、外部変数を安全に共有するための「リンク名」の仕組みと、トラブルを未然に防ぐ実装のコツを解説します。

2. 基礎知識:なぜ名前が変わってしまうのか?

メインフレーム(z/OS)のリンカは、歴史的な経緯から外部シンボル名に制限がある場合があります。特に古い環境や特定のコンパイラ設定では、長い変数名が内部的に8文字程度に切り詰められたり、特殊な記号が付与されたりします。これを「名前のマングリング」と呼びます。
C言語で「long_variable_name_data」という名前で定義しても、リンカが「LONG_VAR」という別の名前で登録していれば、他のプログラムから「long_variable_name_data」で呼び出そうとしてもリンクできないのは当然ですよね。

3. 実装/解決策:リンク名を固定して衝突を防ぐ

この問題を解決する最も確実な方法は、コンパイラに対して「この名前をそのままリンク名として使え」と明示的に指示することです。C言語であれば、pragma指令などを使用して、コンパイラによる自動的な名前変換を抑制し、外部から参照可能な「固定のリンク名」を定義します。

4. サンプルプログラム:外部変数定義のテンプレート

以下は、名前のマングリングを抑制し、他言語(COBOL等)から確実にアクセスできるようにするためのC言語側の定義例です。

/ 外部変数として公開する定義 /
/ 名前が勝手に変換されないよう、リンク名を明示します /

pragma map(g_system_status, “SYSSTAT”) / 内部名 g_system_status をリンク名 SYSSTAT に固定 /

/ グローバル変数の定義 /
static int g_system_status = 0;

/
解説:
1. #pragma map を使うことで、リンカが認識する名前を「SYSSTAT」という8文字以内の名前に固定します。
2. これにより、COBOL側からは「SYSSTAT」という名前で外部定義を参照すれば、確実にこの変数にアクセス可能です。
/

5. 応用・注意点:移行プロジェクトの成功のために

現代のシステム移行において最も重要なのは、行き当たりばったりでコーディングせず、事前に「グローバル変数定義書」を作成することです。

・マッピング表の作成: どのクラスのどの変数が、どの「リンク名」に対応しているかを一覧化したドキュメントを必ず作成しましょう。
・8文字の壁: 基本的に、メインフレームの古い資産との連携を考える場合は、リンク名は「8文字以内・大文字・英数字」で統一するのが最も安全な設計です。
・デバッグのヒント: もしリンクエラーが発生したら、リンカのリスト出力(MAPオプション)を確認してください。そこに実際に登録されている「リンク名」が記載されています。

この「リンク名」を正しくコントロールできるようになれば、言語混在環境のデバッグ作業は驚くほどスムーズになります。ぜひ、今のプロジェクトの設計書を見直してみてください。

コメント

タイトルとURLをコピーしました