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

发布于 2024-11-15 03:50:14 字数 257 浏览 1 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧夏天 2024-11-22 03:50:14

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

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

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

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

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 removes never 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.

挽清梦 2024-11-22 03:50:14

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

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

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

因此,如果您根本不使用某些翻译单元,则其中定义的所有对象可能会被完全删除。

The standard explicitly permits to defer static objects initialization (C++98, [basic.start.init]):

It is implementation-defined whether or not the dynamic initialization (8.5, 9.4, 12.1, 12.6.1) of an object of
namespace scope is done before the first statement of main. If the initialization is deferred to some point
in time after the first statement of main, it shall occur before the first use of any function or object defined
in the same translation unit as the object to be initialized.

(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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文