1

フリースタンディング環境 (基本的には 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
4

1 に答える 1

1

これは最終的にビルド システムの問題でした。リンカ スクリプトがリンカ コマンド ラインで複数回指定されていたため、何らかの形で g++ が停止しました。

于 2010-06-03T13:05:57.360 に答える