現在の (GCC >= 4.6) ツールチェーンを、glibc 2.3.6 に基づくレガシー組み込み ARM/Linux システムに改造しようとしています。ツールチェーンを正常にビルドしましたが、テスト プログラムが libstdc++ でセグメンテーション違反を起こしています。たとえば、次のようになります。
int main()
{
int* foo = new int[100];
delete [] foo;
return 0;
}
... libstdc++ の静的初期化におけるセグメンテーション違反:
#0 0x40082778 in (anonymous namespace)::__future_category_instance ()
at /path/to/src/gcc-4.6.4/libstdc++-v3/src/future.cc:64
#1 0x40082bb0 in __static_initialization_and_destruction_0 (__priority=65535, __initialize_p=1)
at /path/to/src/gcc-4.6.4/libstdc++-v3/src/future.cc:103
#2 _GLOBAL__sub_I_future.cc(void) () at /path/to/src/gcc-4.6.4/libstdc++-v3/src/future.cc:109
#3 0x400e92b8 in __do_global_ctors_aux () from /path/to/symbols/libstdc++.so.6
#4 0x400627a0 in _init () from /path/to/symbols/libstdc++.so.6
#5 0x4000b5e4 in ?? () from /path/to/sysroot/lib/ld-linux.so.2
#6 0x4000b5e4 in ?? () from /path/to/sysroot/lib/ld-linux.so.2
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
他にもいくつか例がありますが、クラッシュ サイトはすべて次のようになります。
Dump of assembler code for function (anonymous namespace)::__future_category_instance():
0x40082764 <+0>: ldr r3, [pc, #264] ; 0x40082874 <(anonymous namespace)::__future_category_instance()+272>
0x40082768 <+4>: push {r11, lr}
0x4008276c <+8>: add r11, sp, #4
0x40082770 <+12>: sub sp, sp, #64 ; 0x40
0x40082774 <+16>: mov r1, #0
=> 0x40082778 <+20>: ldr r3, [r1, r3]
これは、ベース アドレス 0 (r1 = 0、この場合の r3 は 3736) から読み取ろうとしているコードと解釈しますが、これは再配置の問題を示唆している可能性があります。
この特定のクラッシュは-static
、-static-libgcc -static-libstdc++
またはLD_LIBRARY_PATH を介してツールチェーンから libgcc_s.so.1 および libstdc++.so.6 を強制的にロードしたときに発生します。
私はここでほとんど立ち往生しており、ツールチェーンの何が問題なのか、そしてこれがまったく機能するかどうかについての手がかりをいただければ幸いです。