VirtualBoxで実行されているUbuntu(32ビット)でCプロジェクトをコンパイルしようとしています。問題のコードをコンパイルするには、かなりのメモリ、少なくとも3ギガが必要です。そこで、VM 2ギガ。2ギガのスワップスペースが利用可能であれば、それで十分です。何らかの理由で、gccは割り当て後にメモリ不足エラーで失敗しますが、 900メガ程度。メモリ量を2.7ギガ(VirtualBoxで許可されている最大値)に増やすことは役に立ちませんでした。プロセスが使用できるメモリ量には制限があるようです。しかし、ulimit
を実行すると、「無制限」と表示されます。
更新-作成ログは次のとおりです。
libtool:コンパイル:cc -msse2-I。 -I/home/cleong/qb -DPHP_ATOM_INC -I/home/cleong/qb/include -I/home/cleong/qb/main -I/home/cleong/qb -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -DHAVE_CONFIG_H -g -O2 -c /home/cleong/qb/qb_interpreter_gcc.c -fPIC -DPIC -o .libs/qb_interpreter_gcc.o
cc1:合計924852224バイトの後に408バイトを割り当てるメモリ不足
make:*** [qb_interpreter_gcc.lo]エラー1
/ bin/time -vからの出力:
Command exited with non-zero status 2
Command being timed: "make"
User time (seconds): 62.09
System time (seconds): 11.28
Percent of CPU this job got: 64%
Elapsed (wall clock) time (h:mm:ss or m:ss): 1:53.02
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1848592
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 9433
Minor (reclaiming a frame) page faults: 1391779
Voluntary context switches: 5642
Involuntary context switches: 6069
Swaps: 0
File system inputs: 630360
File system outputs: 1376
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 2
Gccのバージョンは4.7.2です。
ソースコードはここにあります:
https://github.com/chung-leong/qb
これはPHP拡張機能です。ビルドプロセスはphpizeを使用します。
更新-32ビットのMageia3でも同じ問題が発生しています。これにはgcc4.7.2も含まれています。代わりに、約2.7ギガで障害が発生します。 64ビット環境では、それは起こりません。
Gcc 4.6.3をインストールし、それを使用してビルドすると、機能します。
-O1
以下の最適化レベルで、64ビットUbuntuがプロジェクトをコンパイルできるという事実は、問題がgccの最適化フェーズにあることを意味します。
プロジェクト内の一部のソースファイルは、バージョン4.7.2で導入されたgccオプティマイザーのバグまたは非効率性によって発生すると思います。これにより、不当な量のメモリが使用されます。
だから私が提案するのは:
-O1
でコンパイルするようにmakeファイルを変更します。この場合、問題はgcc自体にあり、その関数をバグレポートで送信できます(allインクルードファイルと一緒に)。-O1
でコンパイルすることもできます。これは、PHP拡張子で十分なはずです。または、今のところgcc4.6.3のままにすることもできます。うわー、それはプロジェクトです!
このプロジェクトをビルドするには、64ビットホストシステムで実行されているクロスコンパイラを使用する必要があるようです。 FirefoxはそのようにIIRCで構築されています。
GCCは、仮想メモリの断片化が原因でアドレススペースをすべて使い果たした可能性があります。また、統計に表示される900メガバイトは、コミットされた物理メモリである可能性があります。これは通常、予約済みの仮想メモリよりも低くなります。
また、物理メモリとスワップファイルのサイズに関係なく、すべての32ビットプロセスは2Gb以下のメモリにアクセスできます。