2010-06-02 123 views
1

我正在编写C++代码以在独立环境(基本上是ARM板)中运行。除了我遇到了一个绊脚石 - 全局静态构造函数之外,它一直进展顺利。独立式ARM C++代码 - 空.ctor部分

我的理解.ctors部分包含每个静态构造函数的地址列表,我的代码只需迭代此列表并在每个函数调用时调用它。但是,我发现我的二进制文件中的这部分实际上完全是空的!谷歌指出使用“.init_array”而不是“.ctors”(一个EABI的东西),但这并没有改变任何东西。

任何想法,为什么我的静态构造函数不存在?相关链接脚本和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的小精灵有针对性的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 
+3

好吧。只是想说明一个明显的问题。你实际上是否有任何静态类实例? – 2010-06-02 12:20:06

+0

我当然可以 - 至少有两个应该在ARM的最终二进制文件中。 – 2010-06-02 21:31:59

+0

问题更新了一点信息。 – 2010-06-02 21:59:46

回答

1

这结束了被构建系统问题 - 链接器脚本在链接器命令行中被多次指定,从而以某种方式导致g ++窒息。