この種の動作の最も可能性の高い理由は、使用中のメモリモデルです。64ビットモードには、使用されるアドレッシングモードによって区別される3つのメモリモデルがあります。
small
モデルRIP
関連のアドレス指定は、関数の呼び出しからデータへのアクセスまで、すべてに使用されます。RIP
はx64(の64ビット拡張子EIP
)の64ビット命令ポインタレジスタですが、相対アドレスは符号付き32ビット数のみにすることができます(完全な符号付き整数範囲の使用を妨げるいくつかの制限があります)。したがって、結合されたコード+静的データサイズは約2GiBに制限されます。
medium
モデル-プログラムコードは2GiBに制限されているため、RIP
関連する関数呼び出しですが、データシンボルは2つのタイプに分割されます。スモールデータシンボルは、最初の2 GiBのコードとRIP
一致するものであり、スモールモデルと同じ相対的な方法を使用してアドレス指定されます。大きなデータシンボルは、レジスタにロードされたシンボルの絶対アドレスを使用したレジスタアドレス指定を使用してアクセスされます。これは低速ですが、アドレス指定可能なメモリに制限はありません。
large
モデル-すべてのシンボルは、絶対アドレス指定を使用してアクセスされます。コードやデータサイズに制限はありません。
含まれているx64をターゲットにできるほとんどのコンパイラは、使用されるメモリモデルを制御できるオプションをifort
受け入れます。--mcmodel=model
デフォルトのモデルはですsmall
。オブジェクトファイルのサイズは、初期化された静的データが大量にあることを意味します。おそらく、非常に大きな初期化された配列(thinkDATA
またはBLOCK DATA
ステートメント)または多数の小さな配列(100万のコードステートメントでも2 GiBの命令コードが生成されるとは思えません) 。大きなオブジェクトファイルサイズでコンパイルする--mcmodel=medium
か--mcmodel=large
、問題を解決する必要があります。
異なるメモリモデルを使用するオブジェクトコードをリンクすることは災害のレシピであることに注意してください。アプリケーション全体を同じメモリモデルでコンパイルする必要があります。