3つのアプローチの比較
| アプローチ | 難易度 | 情報量 | 適した場面 |
|---|---|---|---|
| 静的解析 nm / objdump / AMBLIST |
低 | 中 | まず最初に実施。シンボル名・モジュール境界・外部参照を迅速に把握する。 |
| 逆コンパイル cobc -C / Cobgen 等 |
中 | 高 | コンパイルリストがなく、処理ロジックをある程度復元したい場合。結果はあくまで参考。 |
| 実行時トレース SYSDUMP / strace / GDB |
高 | 高 | 静的解析では判断できない動的 CALL・条件分岐のパスを確認したい場合。 |
静的解析ツールの選定と使い方
静的解析はモジュールを実行せずに構造を調べる方法です。安全性が高く、最初に実施すべきアプローチです。
# ① シンボル表の確認(T=コード, D=データ, U=未定義外部参照)
nm -g libmodule.so
# ② 逆アセンブル(アセンブラレベルのコード確認)
objdump -d libmodule.so | head -100
# ③ セクション構成の確認
objdump -h libmodule.so
# ④ 文字列埋め込み情報(プログラム名・バージョン情報を探す)
strings libmodule.so | grep -E "[A-Z]{2,}[0-9]{4}|PROGRAM|VERSION|COBOL"
# ⑤ ELF ヘッダ確認(アーキテクチャ・ビット数)
readelf -h libmodule.so | grep -E "Class|Machine|Entry"
💡 SonarQube との組み合わせ
COBOL ソースが復元できた後、SonarQube の COBOL プラグイン(有償)を使うと、コード品質・重複コード・デッドコードの静的解析が自動化できます。モダナイゼーション前の棚卸しに有効です。
逆コンパイルの現実的な使いどころ
COBOL 専用の逆コンパイラは限られており、完全なソース復元は現実的ではありません。以下の方針で取り組んでください。
| ツール / 方法 | 対応環境 | 特徴 |
|---|---|---|
| GnuCOBOL -C オプション | GnuCOBOL 環境 | COBOL → C 変換で生成した C コードを参照。変数名は失われるが処理フローは追える。 |
| IDA Pro / Ghidra | ELF / PE 形式 | 汎用逆アセンブラ。COBOL の構造化コードには向かないが、関数境界・分岐の把握に使える。 |
| ベンダー提供ツール | Micro Focus / IBM | Micro Focus Enterprise Analyzer など。商用ツールで依存関係グラフ・データフロー図を生成できる。 |
⚠️ 逆コンパイル成果物の扱い
逆コンパイルで得られたコードは「動作の参考資料」です。そのままソースとして使用しないでください。必ず PART 07 の検証手順で等価性を確認してください。
実行時トレース・SYSDUMP の活用
動的 CALL やデータ依存の条件分岐は、静的解析では把握できません。実行時に情報を収集します。
# GnuCOBOL の実行時トレースを有効化
export COB_SET_TRACE=Y
export COB_TRACE_FILE=trace.log
# プログラムを実行
./myprogram
# トレースログから CALL された段落・PROGRAM-ID を確認
grep -E "CALL|PROGRAM" trace.log | sort | uniq -c | sort -rn
//TESTJOB JOB CLASS=A,MSGCLASS=X
//STEP1 EXEC PGM=YOURPROG,REGION=64M
//STEPLIB DD DSN=YOUR.LOADLIB,DISP=SHR
//SYSOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=* ← ABEND 時のダンプ出力
//SYSIN DD *
テスト入力データ
/*
SYSDUMP(SVCダンプ)の出力はIPCS(Interactive Problem Control System)で解析します。CALL スタック・PSW・レジスタの値からプログラムの実行経路を特定できます。
💡 strace(Linux)との組み合わせ
GnuCOBOL 環境では strace -e trace=file,process ./myprogram でシステムコールレベルのトレースが取得できます。動的ライブラリのロード順序・ファイルオープンパターンからモジュール構成を把握する際に有効です。
✅ 次の章では…
PART 06 では、調査・抽出フェーズで得た情報を元に、実際にソースファイルへ再構成する方法(モジュール境界の決め方・ファイル分割・コピーブック整理)を解説します。