第2章 互換に関する情報
2.1 NetCOBOL開発環境
2.1.4 リンカの変更について
・ Cランタイムライブラリの変更(LIBC.LIBからMSVCRT.LIB)
旧リンカは、Cランタイムライブラリとして、LIBC.LIBを指定していましたが、新リンカは、MSVCRT.LIBを指定します。
・ リンクオプション/DYNAMICBASEの追加
新リンカは、旧リンカのオプションに無かった/DYNAMICBASE (アドレス空間ランダム化、以降ではASLRと呼びます)が既定で有効 となります。/DYNAMICBASEを有効にしてリンクした場合、実行時にCOBOLプログラムが異常終了することがあります。
・ リンクオプション/DEBUGTYPEの削除
新リンカでは指定可能なオプションから/DEBUGTYPEが削除されました。これによりデバッグ時、/DEBUGTYPEと排他関係にあった/
INCREMENTAL(インクリメンタル・リンク)が有効になります。インクリメンタル・リンクした場合、実行時にCOBOLプログラムが異常終了 することがあります。
・ ワーニングの強化
ASCII範囲外のファイル名に対して、以下のようなワーニングメッセージ(LNK4232)が出力されるようになります。
LINK : warning LNK4232: 名前 あいうえお.dll に ASCII 文字以外の文字が含まれています。932 以外の ANSI コードページを使用す ると、DLL をシステムに読み込めない可能性があります。
実行時コード系がシフトJISのDLLを、シフトJIS以外の環境(*1)で動作させた場合、DLL名にASCII範囲外の文字が含まれていると、正 しく呼び出せない可能性があります。動作環境がシフトJIS以外でかつ、実行時コード系がシフトJISのDLLを作成する場合、COBOL ソースファイル名をASCII範囲の文字で構成するか、または、リンクオプション /OUTを指定し、出力ファイル名をASCII範囲内の文字で 構成してください。
*1: シフトJIS以外の環境とはコードページが932以外の環境です。動作させる環境が日本語環境であればLNK4232は無視できます。
コードページはシステムのコマンドプロンプトからchcpコマンドの実行で確認できます。
注意
- NetCOBOL Studioを使用する場合はプロジェクトプロパティのターゲット名を変更してください。
- PowerCOBOLを使用する場合はプロジェクトのモジュール名変更してください。
- プロジェクトマネージャを使用する場合は、プロジェクト構成に追加している動的リンクライブラリファイルの名前を変更してください。
・ リンクオプション/SUBSYSTEMの既定値の変更
新リンカは、リンクオプション/SUBSYSTEMの既定値が変更されています。
NetCOBOLV11.0.0以降での変更点
リンカの仕様変更に伴い、NetCOBOLV11.0.0以降では以下の対処をします。
・ 外部シンボルのコード系を変更
目的プログラムに出力する外部シンボルの文字コードを変更します。V10.5.0以前のコンパイラはシフトJISの外部シンボルを出力し ていましたが、V11.0.0以降のコンパイラはUnicodeの外部シンボルを出力します。
・ NetCOBOL開発環境(*1)の既定値を変更
- Cランタイムライブラリ
V10.5.0以前ではCランタイムライブラリとしてLIBC.LIBを指定していましたが、V11.0.0以降では、MSVCRT.LIBを指定します。
- 既定のリンクオプションを追加
V11.0.0以降の開発環境では、既定で以下のリンクオプションを設定します。
- /DYNAMICBASE:NO - /INCREMENTAL:NO
*1: NetCOBOL Studio、プロジェクトマネージャ、WINLINK、およびPowerCOBOL
・ NetCOBOLコマンドプロンプトの提供
MAKEファイルおよびバッチファイルを使用して、COBOLプログラムを翻訳・リンクする場合、V10.5.0以前ではシステムのコマンド
プロンプトを使用していましたが、V11.0.0以降では、新たに提供するNetCOBOLコマンドプロンプトを使用します。NetCOBOLコマ ンドプロンプトでは、既定で以下のリンクオプションを設定します。
- /DYNAMICBASE:NO
- /INCREMENTAL:NO
・ 翻訳時メッセージよる注意喚起
V11.0.0以降で使用するリンカにおいて、/DYNAMICBASEまたは/INCREMENTALを有効にして巨大なCOBOLプログラムをリン クすると、COBOLプログラムの実行時に異常終了する場合があります。
V11.0.0以降のコンパイラは、/DYNAMICBASEおよび/INCREMENTALを有効にしてリンクした時に上記の現象を引き起こす可能性 のある目的プログラムを生成した場合、JMN6415I-Wを出力します。
[V11.0.0~V12.0.0]
JMN6415I-W リロケーション個数が上限に達しました.リンク時、LINKコマンドに/DYNAMICBASE:NOを指定してください.
[補足]上記メッセージには/INCREMENTALの記述が不足していたため、V12.2.0で改善します。/INCREMENTAL:NOの指定がな くても、NetCOBOLの開発環境を利用してリンクしたプログラムであれば問題は起きません。
[V12.2.0以降]
JMN6415I-W この目的プログラムは/DYNAMICBASEまたは/INCREMENTALを有効にしてリンクすると,実行時に異常終了します.リンク 時,/DYNAMICBASE:NOと/INCREMENTAL:NOを有効にしてください.
メッセージの詳細については、“メッセージ集”を参照してください。
影響および対処方法
以下の条件に該当する場合、対処をお願いします。
・ ASCII範囲外の文字を含む外部名(*2)を持つプログラムおよびこれを呼び出すプログラムの場合
- V10.5.0以前のNetCOBOLで作成した目的プログラムは、新リンカでリンクできません。
- V10.5.0以前のNetCOBOLで作成したDLLおよびEXEとV11.0.0以降で作成したDLLおよびEXEとのプログラム間連絡機能は使
用できません。
[対処方法]
ASCII範囲外の文字を含む外部名を持つプログラムおよびこれを呼び出すプログラムをV11.0.0以降のコンパイラで再翻訳し、再 リンクしてください。ASCII範囲外の文字を含む外部名を持つプログラムが不明な場合は、チェックツール(ASCIICHK.exe)を使用 してください。呼び出すプログラムが不明な場合は、呼び出す可能性があるプログラムを全て再翻訳してください。
*2: プログラム名、クラス名、メソッド名、プロパティ名、二次入口点名
・ MAKEファイルおよびバッチファイルを使用する場合
NetCOBOL V11.0.0以降では、以下の記述があるMAKEファイルとバッチファイルは使用できません。
- CランタイムライブラリとしてLIBC.LIBを指定
- リンクオプションに/DEBUGTYPEを指定 [対処方法]
MAKEファイル、バッチファイルを以下のように修正してください。
- 「LIBC.LIB」と記述した箇所を「MSVCRT.LIB」に修正 - リンクオプションから/DEBUGTYPEを削除
・ ビルドされたアプリケーションに100個程度以上のDLLが含まれる場合
NetCOBOL V11.0.0以降でビルドされたアプリケーションに100個程度以上のDLLが存在する場合、Fiber Local Storage(FLS)の枯渇 が発生しDLLのロードに失敗する場合があります。
[対処方法]
- DLLがCOBOLだけで作成されている場合
リンク時、「MSVCRT.LIB」の指定をやめ、リンクオプション「/NOENTRY」を指定してDLLを作成してください。
- DLLがCOBOLとCで作成されている場合
- 同一のDLLにする場合
リンク時、「MSVCRT.LIB」を指定してDLLを作成してください。Cプログラムを翻訳オプション「/MT」で翻訳している場合、「/
MD」を指定して再翻訳してください。
- 別々のDLLにする場合
COBOLのDLL作成時、「MSVCRT.LIB」を指定せず、リンクオプション「/NOENTRY」を指定してDLLを作成してください。C のDLL作成時、翻訳オプション「/MD」を指定して翻訳しDLLを作成してください。
・ NetCOBOL以外の開発環境を使用する場合
NetCOBOL V11.0.0以降で提供する開発環境(NetCOBOL Studio、プロジェクトマネージャ、WINLINK、PowerCOBOL、および NetCOBOLコマンドプロンプト)以外の開発環境を使用する場合、以下のリンクオプションが有効となり、実行時にCOBOLプログラムが 異常終了する場合があります。
- /DYNAMICBASE
- /INCREMENTAL [対処方法]
NetCOBOL開発環境を使ってリンクしてください。
・ リンクオプション/SUBSYSTEMの既定値の変更
/SUBSYSTEMの既定値の変更により、COBOLのコンソールウィンドウおよびスクリーン機能を使用した場合、出力した文字列がウィ ンドウ内に正しく収まらない場合があります。
[対処方法]
COBOLのコンソールウィンドウおよびスクリーン機能を使用する場合、主プログラムをリンクする時に、LINKコマンドに以下を指定
してください。
※主プログラムを翻訳するとき、翻訳オプションMAIN(WINMAIN)を指定した場合はWinMain型、また、翻訳オプション MAIN(MAIN)を指定した場合はmain型を示します。
[WinMain型]
/SUBSYSTEM:WINDOWS,5.01 [main型]
/SUBSYSTEM:CONSOLE,5.01
※スクリーン機能の場合、環境変数情報@ScrnSizeによって論理画面の大きさを変更することで、正しく表示することができます。