我编写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
我使用的是ARMELF目标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