通常、このリンカ エラーは-Olink
最適化とは関係ありません-auto_sda
。リンカーはプログラム全体を認識し、64K 以上のデータを自動 SDA 化してプログラムを台無しにしないようにします。(これはまだリンカーのバグである可能性がありますが、その可能性は低いです。)
このエラーは通常、リンカほど知覚力のない人が、リンカが実行する機会を得る前に、すでに64K バイト以上を SDA セクションに入れているために発生します。あなたが次のようなことをした場合、鈍感な個人はあなたかもしれません
#pragma startsda
int small_data[10000]; // 40Kbytes
int small_data_also[10000]; // another 40Kbytes
#pragma endsda
(複数のファイルに分割される可能性があります。実際、1 つのファイルで 64K を超える SDA を作成しようとすると、コンパイラまたはアセンブラの診断が表示されると思います)。
ただし、次のようなオプションを渡している場合 (ファイル全体で 4 バイト以下のすべてのグローバル変数-sda=4
を投げたかのように動作します)、大量のグローバル変数がある場合、知覚の鈍い人もコンパイラである可能性があります。#pragma startsda
コンパイラは、20 個の個別のファイルのそれぞれで 10,000 バイトを喜んで SDAize しますが、リンカーは、200,000 バイトの SDA を処理していると不平を言います。(リンカーは、通常のデータ参照を SDA 参照に書き換えるほどスマートですが、逆方向に書き換える方法を教えられたことはありません。)
最後に、合格していないと思っ-sda=
ていても驚くかもしれません。-#
または-v
オプションを指定してドライバを実行します。IIRC、デフォルトでccintppc
秘密裏に合格-sda=4
。ドライバーにあなたの「手伝い」をやめさせることができます。-sda=none
またはを渡すだけ-sda=0
で、ドライバーのデフォルトをオーバーライドする必要があります。最もコールドなコードから始めて、ファイルごとにこのオプションを渡すことをお勧めします。