フリースタンディング環境 (基本的には ARM ボード) で実行する C++ コードを書いています。つまずきのブロック、つまりグローバル静的コンストラクターに遭遇したことを除いて、それはうまくいっています。
私の理解では、.ctors セクションには各静的コンストラクターへのアドレスのリストが含まれており、私のコードでは、このリストを反復処理して、各関数を呼び出します。しかし、バイナリのこのセクションは実際には完全に空であることがわかりました! Google は、「.ctors」(EABI のもの) の代わりに「.init_array」を使用することを指摘しましたが、何も変わっていません。
静的コンストラクターが存在しない理由についてのアイデアはありますか? 関連するリンカー スクリプトと objdump の出力は次のとおりです。
.ctors :
{
. = ALIGN(4096);
start_ctors = .;
*(.init_array);
*(.ctors);
end_ctors = .;
}
.dtors :
{
. = ALIGN(4096);
start_dtors = .;
*(.fini_array);
*(.dtors);
end_dtors = .;
}
--
2 .ctors 00001000 8014c000 8014c000 00054000 2**2
CONTENTS, ALLOC, LOAD, DATA
<snip>
8014d000 g O .ctors 00000004 start_ctors
<snip>
8014d000 g O .ctors 00000004 end_ctors
arm-elf を対象とした GCC コンパイラ (4.4.1) を使用しています。
更新: 出力バイナリも__static_initialization_and_destruction_0
、これまでに見たことのないシンボルでいっぱいです。
更新 2: これは、コンパイルされたオブジェクト ファイル (メイン バイナリにリンクされている) の objdump からの抜粋で、.ctors セクションはそのままです。
21 .ctors 00000004 00000000 00000000 00000864 2**2
CONTENTS, ALLOC, LOAD, RELOC, DATA
RELOCATION RECORDS FOR [.ctors]:
OFFSET TYPE VALUE
00000000 R_ARM_ABS32 _GLOBAL__I__ZN9SomeStaticClass10m_InstanceE