2

2GB を超える実行可能ファイルを生成するコードがあります (生成されたコードです)。

x64 で gcc 4.3.2 を使用すると、次のようなエラーが発生します。

crtstuff.c:(.text+0x20): relocation truncated to fit: 
  R_X86_64_32S against `.dtors'

だから私は-mcmodel=largeオプションが必要であることを理解しています。ただし、それは何もしないか、システムの問題を解決しません。

特定のバージョンのgccからのみサポートされており、それより前のバージョンではオプションが無視されていたことをどこかで読んだと確信しています。それが何であるかさえ知っていれば、運用チームにそのバージョンの gcc をインストールするように伝えます。しかし、その仮説が正しいかどうか、もしそうなら、どのバージョンで機能が導入されたかを示す証拠を今のところ見つけることができません.

例えば

(1)ここでは、オプションは何もしないと述べられています。問題の本は、「GCC 4.x」をカバーしていると主張しています。この本は2006年に出ました。

(2)ここではコンパイラのバグがオプションに対して報告されているため、そのバージョンでは少なくとも何かを行う必要があると結論付けています。それはgcc 4.6.1のようです。

そのため、機能が実装されたバージョンを正確に示す証拠を見つけることはできなくなりましたが、少なくともこれが時間の経過とともに変更されたという証拠があります.

さまざまな GCC 4.x バージョンすべての変更ログを調べてみましたが、役に立ちませんでした (通常、それらは非常に優れているため、そこに情報がないということは、私が間違っていることを意味し、バージョン間で何も変更されていないことを意味します)。

編集: これはおそらくうまくいったことを暗示しているようですが、「crtstuff.cを再コンパイル」する必要がありますが、そのファイルがどこにあるのか、どのようにそれを行うのかはよくわかりません。

4

1 に答える 1

1

4.4 がこの機能のサポートを追加したバージョンだと思います。以下に、(コードではなく) 大きなデータ ブロックが必要な場合に、4.4 は動作するが 4.1 は動作しないことを示します。4.2 と 4.3 についてはよくわかりませんが、あなたの例と私の記憶の両方から、4.3 にはこれに対する機能的なサポートがなかったことを示唆しています。私の例では、特定のインストールが機能するかどうかを検証することができますが、それ以外の場合は簡単にコンパイルできるコードのビットを使用できます。

背景として、ストリーム ベンチマークのフォークであるプログラムを維持しています。このプログラムは、大規模なシステムをテストするために 64 ビット構造を使用するように特別に変更されています。「-mcmodel=large」を使い始めるまで、これらの「relocation truncated to fit」エラーに悩まされていました。実際に機能しない限り、フォークはコンパイル/実行されません。私のプログラムと互換性があることが確実にわかっている gcc の最も古いバージョンは、Debian Squeeze に同梱されている 4.4.5 です。

これは、ストリーム コンパイルのフォークと、オプションなしで失敗した後、大規模なモデルで 4 GB を超える RAM を使用することを示す完全なテスト ケースです。

$ gcc --version
gcc (Debian 4.4.5-8) 4.4.5
...
$ git clone https://github.com/gregs1104/stream-scaling.git
$ cd stream-scaling
$ gcc -O3 -DN=200000000 -fopenmp stream.c -o stream
/tmp/cca8rR1I.o: In function `checkSTREAMresults':
stream.c:(.text+0x34): relocation truncated to fit: R_X86_64_32S against `.bss'
...
stream.c:(.text+0x6ab): additional relocation overflows omitted from the output
collect2: ld returned 1 exit status
$ gcc -O3 -DN=200000000 -fopenmp stream.c -o stream -mcmodel=large
$ ./stream
-------------------------------------------------------------
STREAM version $Revision: 5.9 $
-------------------------------------------------------------
This system uses 8 bytes per DOUBLE PRECISION word.
-------------------------------------------------------------
Array size = 200000000, Offset = 0
Total memory required = 4577.6 MB.
...

RedHat 5 派生ソフトウェア (CentOS 5.8) を実行している大規模なモデルを持たない gcc のバージョンでは、次のようになります。

$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52)
    ...
$ gcc -O3 -DN=200000000 -fopenmp stream.c -o stream -mcmodel=large
stream.c:1: sorry, unimplemented: code model ‘large’ not supported yet

そのため、古いバージョンの gcc では、オプションを無視するだけでなく、そのエラーをスローする必要があります。

crtstuff は gcc に付属するライブラリです。あなたがリンクした gcc メーリング リストのバグ レポートは、RedHat 5 システム用に独自の gcc を構築しようとしている人からのものでした。彼らは大規模なモデルで gcc の一部を再構築しましたが、元の 4.1 で構築された crtstuff ライブラリにまだリンクしていました。適切にパッケージ化された gcc を使用している場合、この問題に遭遇することはありません。そのため、gcc 開発者はこれを実際のバグと見なしませんでした。gcc 4.4以降が必要だと思います。

于 2012-07-17T22:38:24.980 に答える