ctor init不调用库中的全局ctor实例

时间:2011-06-11 18:39:59

标签: c++ assembly constructor arm startup

我正在使用SourceryGpp lite开发一个应用程序和一个库。

我没有使用标准库或默认启动文件。 所以要调用全局ctrs,我正在做以下代码:

ldr r0,=__ctors_init__
ldr r0,[r0]
mov lr,pc
bx r0

所以问题是我在静态库中定义了一些全局实例,但是它们的ctors永远不会被上面的代码调用。奇怪的是,应用程序的全局ctors被成功调用,任何人都知道为什么?

2 个答案:

答案 0 :(得分:5)

这是静态库和运行时初始化的全局变量的一个众所周知的问题。

大多数链接器只包含实现主程序依赖性所需的静态库组件。如果没有使用编译单元中的任何对象,则链接器删除 从不添加整个编译单元,并且不会发生全局初始化的副作用。

有一个很好的解释here(最终摘要here

标准库提供的启动代码会遇到同样的问题。

答案 1 :(得分:3)

标准明确允许推迟静态对象初始化(C ++ 98,[basic.start.init]):

  

是否实现定义了对象的动态初始化(8.5,9.4,12.1,12.6.1)   命名空间范围在main的第一个语句之前完成。如果初始化推迟到某一点   在第一个main语句之后的时间内,它应该在第一次使用任何定义的函数或对象之前发生   在与要初始化的对象相同的翻译单元中。

(最新的C ++ 0x草案有一些不同的措辞。)

因此,如果您根本不使用某些翻译单元,那么在那里定义的所有对象都可能被完全删除。