NetCOBOL V11.0.0より、使用するMicrosoft社製リンカのバージョンを最新にします。留意すべきリンカの仕様変更は以下のとおりです。
外部シンボルのコード系の変更(シフトJISからUnicode)
V10.5.0以前で使用するリンカ(以降では旧リンカと呼びます)は、外部シンボルの文字コードをシフトJISとして処理していましたが、V11.0.0以降で使用するリンカ(以降では新リンカと呼びます)は、外部シンボルの文字コードをUnicodeとして処理します。
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、プロジェクトマネージャ
NetCOBOLコマンドプロンプトの提供
MAKEファイルおよびバッチファイルを使用して、COBOLプログラムを翻訳・リンクする場合、V10.5.0以前ではシステムのコマンドプロンプトを使用していましたが、V11.0.0以降では、新たに提供するNetCOBOLコマンドプロンプトを使用します。NetCOBOLコマンドプロンプトでは、既定で以下のリンクオプションを設定します。
/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, プロジェクトマネージャ, NetCOBOLコマンドプロンプト)以外の開発環境を使用する場合、以下のリンクオプションが有効となり、実行時にCOBOLプログラムが異常終了する場合があります。
/DYNAMICBASE
/INCREMENTAL
リンクオプション/DYNAMICBASE:NO、/INCREMENTAL:NOを指定してください。または、NetCOBOL開発環境を使ってリンクしてください。
リンクオプション/SUBSYSTEMの既定値の変更
/SUBSYSTEMの既定値の変更により、COBOLのコンソールウィンドウおよびスクリーン機能を使用した場合、出力した文字列がウィンドウ内に正しく収まらない場合があります。
COBOLのコンソールウィンドウおよびスクリーン機能を使用する場合、主プログラムをリンクする時に、LINKコマンドに以下を指定してください。
※主プログラムを翻訳するとき、翻訳オプションMAIN(WINMAIN)を指定した場合はWinMain型、また、翻訳オプションMAIN(MAIN)を指定した場合はmain型を示します。
[WinMain型]
/SUBSYSTEM:WINDOWS,5.01
[main型]
/SUBSYSTEM:CONSOLE,5.01
※スクリーン機能の場合、環境変数情報@ScrnSizeによって論理画面の大きさを変更することで、正しく表示することができます。