COBOLのビルドフロー
COBOL のビルドは「ソースコード → コンパイル → リンク → 実行」という流れで行われます。 それぞれの段階で生成される成果物を理解することが、分離作業の前提知識になります。
.cbl / .cob
ソースコード
ソースコード
.cpy / .cpb
コピーブック
コピーブック
↓
COPY 文で展開(コンパイル前処理)
↓
コンパイラ(cob / cobc / IGYCRCTL)
.o / .obj
オブジェクトファイル
オブジェクトファイル
←
コンパイルリスト (.lst)
※分析に使える
※分析に使える
↓
リンカー(ld / IEWBLINK)
↓
リンカーマップ (.map)
※エントリポイント特定に使える
※エントリポイント特定に使える
ロードモジュール
(実行可能ファイル / PDS メンバー)
(実行可能ファイル / PDS メンバー)
↓
実行時(JCL / シェル)
実行結果・DUMP・トレース
※構造推定に使える
※構造推定に使える
各成果物の役割と特徴
| 成果物 | 拡張子の例 | 内容 | 分析への活用 |
|---|---|---|---|
| ソースコード | .cbl .cob .CBL |
人間が書いた COBOL プログラム。IDENTIFICATION DIVISION から始まる。 | そのまま読める。理想はこれが揃っている状態。 |
| コピーブック | .cpy .cpb .copy |
共通定義(データ構造・定数など)を切り出したインクルードファイル。COPY 文で展開される。 | データ構造の復元に不可欠。コピーブックだけ別途管理されていることも多い。 |
| コンパイルリスト | .lst |
コンパイル時に生成されるテキスト。展開後のソース・シンボル表・エラーリストが含まれる。 | ソースに近い情報が含まれる。残っていれば分析の第一候補。 |
| オブジェクトファイル | .o .obj |
コンパイル後の中間形式。機械語に近いが未リンク状態。シンボル情報が残ることがある。 | nm や objdump でシンボルを確認できる。 |
| リンカーマップ | .map |
リンク時に生成。モジュール内の各セクションのアドレスとシンボル名の対応表。 | エントリポイントとモジュール境界の特定に使う。 |
| ロードモジュール | 拡張子なし / PDS メンバー | 実行可能な最終成果物。複数のオブジェクトがリンクされている。 | 分離作業の出発点。これしかない状態からスタートすることが多い。 |
「ソースがない状態」で何ができて何ができないか
✅ できること
シンボル情報からプログラム名・エントリポイントを特定する。コンパイルリストが残っていればソースに近い情報を復元できる。実行・トレースにより動作を確認する。既存テストデータを使った入出力比較で等価性を検証する。
⚠️ 制約があること
逆コンパイルで得られるソースはオリジナルと完全一致しない(変数名・コメント・データ名が失われている場合がある)。コンパイラの最適化によってコード境界が変わっている可能性がある。
❌ できないこと
元のコメントやコーダーの意図を完全に復元すること。最適化で消えたコードを再現すること。コピーブックが失われている場合のデータ構造定義の完全復元。
⚠️ 逆コンパイル成果物の扱い
逆コンパイルで得られたソースコードを「元のソースコード」として扱わないでください。あくまで「動作推定の補助資料」です。改修や移植の際は必ず動作テストで等価性を確認し、コードの意味はドキュメントや担当者ヒアリングで補完してください。
主要環境の違い
| 環境 | コンパイラ | ロードモジュール形式 | 分析ツール |
|---|---|---|---|
| IBM z/OS メインフレーム | IGYCRCTL (Enterprise COBOL) | PDS / PDSE メンバー(MVS 形式) | AMBLIST, DUMPDS, IPCS |
| GnuCOBOL (Linux/Unix) | cobc | ELF 形式(.so / 実行バイナリ) | nm, objdump, readelf, strings |
| Micro Focus / ACUCOBOL | cob / ccbl | 独自形式(.gnt / .int / .exe) | ベンダー提供のデバッガ・解析ツール |
💡 環境を最初に確認する
分析手法はコンパイラ・OS・リンカーに強く依存します。作業前に「どのコンパイラでビルドされたか」「どの OS で動いているか」を確認してください。不明な場合は strings コマンドでロードモジュールの文字列を検索すると、コンパイラ名・バージョン・ビルド日時が埋め込まれていることがあります。