4

誰かがこれについて簡単に答えてくれることを願っていますが、本質的に最適化をオンにすると、次のエラーが発生します。

[elxr] (エラー) 小さなデータ領域のオーバーフロー: 場所 __sti___13_test_main_cpp_252229d3+0xc のファイル test_main.o でシンボル oe_init_intconn を参照するための再配置を実行中に、0xfff9f6fc (符号付き) が 16 ビットに収まりませんでした

このリンカー ディレクティブを挿入すると、同様のエラーが発生します。

-auto_sda

彼らのマニュアルでは、このリンカ エラーについて言及していません。Integrity 5.10 を使用しています

4

3 に答える 3

5

通常、このリンカ エラーは-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で、ドライバーのデフォルトをオーバーライドする必要があります。最もコールドなコードから始めて、ファイルごとにこのオプションを渡すことをお勧めします。

于 2012-09-06T18:03:48.923 に答える
1

いくつかの調査を行った後、すべてが SDA オプションを使用しないライブラリをリンクすると、この競合が発生する可能性があります。私はこれらのライブラリがどのように構築されているかを制御できないため、現在、問題を解決しているように見える次のフラグを GPJ に適用しました。

-Onolink
-no_auto_sda
-nothreshold

これらのオプションはすべてのリンカー最適化を無効にし、SDA オプションを完全に無効にすることに注意してください。

于 2010-05-12T11:24:48.800 に答える