1

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

据我了解,.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-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 回答