我正在使用SourceryGpp lite开发一个应用程序和一个库。
我没有使用标准库或默认启动文件。 所以要调用全局ctrs,我正在做以下代码:
ldr r0,=__ctors_init__
ldr r0,[r0]
mov lr,pc
bx r0
所以问题是我在静态库中定义了一些全局实例,但是它们的ctors永远不会被上面的代码调用。奇怪的是,应用程序的全局ctors被成功调用,任何人都知道为什么?
答案 0 :(得分:5)
这是静态库和运行时初始化的全局变量的一个众所周知的问题。
大多数链接器只包含实现主程序依赖性所需的静态库组件。如果没有使用编译单元中的任何对象,则链接器删除 从不添加整个编译单元,并且不会发生全局初始化的副作用。
标准库提供的启动代码会遇到同样的问题。
答案 1 :(得分:3)
标准明确允许推迟静态对象初始化(C ++ 98,[basic.start.init]):
是否实现定义了对象的动态初始化(8.5,9.4,12.1,12.6.1) 命名空间范围在main的第一个语句之前完成。如果初始化推迟到某一点 在第一个main语句之后的时间内,它应该在第一次使用任何定义的函数或对象之前发生 在与要初始化的对象相同的翻译单元中。
(最新的C ++ 0x草案有一些不同的措辞。)
因此,如果您根本不使用某些翻译单元,那么在那里定义的所有对象都可能被完全删除。