ctor init 不调用库中的全局 ctor 实例
我正在使用 SourceryGpp lite for arm 开发一个应用程序和一个库。
我没有使用标准库或默认启动文件。 因此,要调用我正在执行以下代码的全局ctrs:
ldr r0,=__ctors_init__
ldr r0,[r0]
mov lr,pc
bx r0
所以问题是我在静态库中定义了一些全局实例,但它们的构造函数从未被上面的代码调用。奇怪的是应用程序的全局ctors被成功调用,有人知道为什么吗?
I'm developing an application and a library using SourceryGpp lite for arm.
I'm not using standard libs or default start files.
So to call the global ctrs i'm doing to following code:
ldr r0,=__ctors_init__
ldr r0,[r0]
mov lr,pc
bx r0
So the problem is that I'm defining some global instances in the static library, but the their ctors are never called by the above code. The weird thing is that the global ctors of the application are successfully called, anyone knows why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是静态库和具有运行时初始化的全局变量的一个众所周知的问题。
大多数链接器仅包含满足主程序依赖关系所需的静态库组件。如果编译单元中没有使用任何对象,则链接器
删除永远不会添加整个编译单元,并且不会发生全局初始化的副作用。有一个很好的解释此处(最终摘要此处)
使用标准库提供的启动代码也会遇到同样的问题。
This is a well known problem with static libraries and global variables with runtime initialization.
Most linkers will only include components of the static library that are needed to fulfill a dependency of the main program. If none of the objects in the compilation unit are used, the linker
removesnever adds the compilation unit as a whole, and side effects of global initialization do not occur.There's a good explanation here (final summary here)
You would have the same problem with the standard library-provided startup code.
标准明确允许推迟静态对象初始化(C++98,[basic.start.init]):
(最新的 C++0x 草案的措辞略有不同。)
因此,如果您根本不使用某些翻译单元,则其中定义的所有对象可能会被完全删除。
The standard explicitly permits to defer static objects initialization (C++98, [basic.start.init]):
(latest C++0x draft has a bit different wording.)
So if you don't use some translation unit at-all, all the objects defined there may be removed completely.