最初は
// a.cpp
#include <stdexcept>
char array[128 * 1024]; // 128 KB
main()
{
std::runtime_error e("e");
}
$ spu-g++ -Os -D NDEBUG a.cpp
/usr/lib/gcc/spu/4.1.1/../../../../spu/bin/ld: .bss exceeds local store range
みたいな何の変哲もないコードで SPE のサイズをオーバーしちゃってハマってたのね。
で、原因を調べてみたら、どうやら原因は std::runtime_error が依存している std::string にあるらしい事が判明。
main のみ:
$ spu-g++ -Os -D NDEBUG a2.cpp
$ ll a.out
-rwxr-xr-x 1 yoffy yoffy 97K 2008-08-30 11:01 a.out
string を使ってみる:
// a3.cpp
#include <string>
main()
{
std::string s;
}
$ spu-g++ -Os -D NDEBUG a3.cpp
$ ll a.out
-rwxr-xr-x 1 yoffy yoffy 167K 2008-08-30 11:04 a.out
std::allocator を少し疑ったんだけど、std::vector は問題ないので std::string 側に原因がありそうな気がする。面倒くさいので細かくは追ってない。
別に stdexcept や string が無くても困らないけど、SPE 用にもう少し考えてくれてもいいんじゃないだろうか。
追記:
$ spu-gcc -Os -D NDEBUG a4.c
$ ll a.out
-rwxr-xr-x 1 yoffy yoffy 4.9K 2008-08-30 11:34 a.out
…。
何もしてないのに 97 KB も使うっておかしいなあとは思ってたんだよ。これ、libstdc++ が怠慢じゃない?コンパイラオプションで例外とか止めたら小さくできるのかな。