本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSC]L2041 の解決方法

文書番号: 401170

最終更新日: 2004/04/27


この資料は以下の製品について記述したものです。


概要

この資料は、リンク時に発生する以下のエラーの原因と解決方法について説明した
ものです。
  リンクエラー: L2041    stack plus data exceed 64K
  ヘルプやドキュメントの解説
  『 near データと要求したスタックのサイズ合計が 64K を越えると、プログラムは
   正しく動作しません。....』

詳細

弊社の言語処理系では、デフォルトデータセグメント( DS レジスタの示すセグメ
ント)を DGROUP というセグメントグループでくくります。
このセグメントグループには、以下のセグメントがグループ化されています。
  DATA    . . .  初期化された near データ
  BSS     . . .  未初期化の near データ
  CONST   . . .  定数データ
  STACK   . . .  スタック
  near ヒープ
(この他にも、処理系によっては若干セグメントが追加されることがあります。)
near ヒープは動的に確保されますので、リンク時にエラーになることはありませ
ん。つまり、 L2041 エラーは、上記のセグメントのうち、near ヒープ以外のセ
グメントの合計が 64K byte を超えたことを意味します。
STACK はリンク時のオプションで変更できますが、デフォルトサイズは 2K byte です。 通常あまり大きく取ることはありませんので、多くの場合、問題はそのほかのデータに あることが考えられます。スタックサイズを大きな値に変更しているときは、でき
る限り小さな値にしてください。
メモリモデルが、スモールモデルやミディアムモデルの場合、データの合計は 64K
byte を超えることはできません。そのため、このエラーを回避するためには、
DATA、BSS、CONST のようにスタティック (静的) に確保される near データを減らし、 それらを far ヒープに確保しなくてはなりません。しかし、この場合、プログ
ラムが複雑になったり、処理系によっては対応ができないこともあります。
そのような場合にはメモリモデルを変更しなくてはなりません。
コンパクト、ラージ、ヒュージのメモリモデルでは、データの合計は 1M byte ま
で扱うことができ、far ヒープも容易に扱うことができます。データそのものを
減らせない場合には、これらのメモリモデルを選択するのが最も簡単な方法で
しょう。
しかし、これらのメモリモデルでも、L2041 エラーが発生することがあります。
これはコンパイラの制限です。コンパイラは、できる限りデフォルト データセグ
メントにデータを割り当てようとします。これは、アクセス速度とコードサイズ
の効率化のためです。デフォルトでは 32K byte 未満の静的データを DGROUP 内に
割り当てます。
この値(データスレッショルド)を変更するのがコンパイルオプションの /Gt です。 /Gt は、その後にバイト単位の数字指定を伴います。指定がなければ、256 が指定
されたものと見なします。つまり、256 byte 以上の静的データは新しいデータセグ
メントに割り当てられます。
指定値を小さくすればするほど L2041 のエラーは発生しなくなりますが、その分
多くのセグメントが生成されることになり、そのセグメントへのアクセス効率も悪
くなります。ですから、エラーの発生しない範囲で、できるだけ大きな値を指定す
ることが理想です。

対処方法

以下のいずれかの方法で回避することができます。

1 ) スタックサイズをオプションで大きな値に変更しているとき

(コンパイルオプション /F、リンクオプション /ST: )
できる限り、スタックサイズを小さくして、再度リンクを行う。
また、グローバルデータで必要のないものが確保されていれば、 削除して再コ
ンパイルする。

2) 1)で解消できないとき

64K byte を越えるデータを扱えるメモリモデル(コンパクト、ラージ、ヒュージ)
への変更 ( /AC, /AL, /AH )、およびコンパイルオプション /Gt を使用する。

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: C6 C7 KBPRB QC20 VC10 VC15 KB401170
Technology: kbAudDeveloper kbCCompPDS600DOS kbCCompSearch kbQC200 kbvc150 kbVCsearch kbZNotKeyword3 kbZNotKeyword8

inserted by FC2 system