__dso_handle在哪里定义?

rev*_*vit 13 linker llvm libstdc++

尝试编译我的程序时,我有一个未解决的符号错误,抱怨它无法找到__dso_handle.这个函数通常定义在哪个库中?

以下结果是否nm on libstdc++.so.6意味着包含它?

我试图链接它,但错误仍然发生.

nm libstdc++.so.6 | grep dso
00000000002fc480 d __dso_handle
Run Code Online (Sandbox Code Playgroud)

Zac*_*c B 15

__dso_handle是一个"守卫",用于在全局销毁期间识别动态共享对象.

实际上,你应该在这里停止阅读.如果你试图通过搞乱来打败对象识别__dso_handle,那么可能是非常错误的.

但是,既然你问过它的定义:答案很复杂.要表示其定义的位置(对于GCC),请iostream在C++文件中使用,然后执行extern int __dso_handle;.由于类型冲突,这应该表明声明的位置(请参阅此论坛帖子获取源代码).

有时,它是手动定义的.

有时,它是由编译器安装的"运行时"定义/提供的(实际上,CRT通常只是一堆二进制头/入口点管理代码,以及一些出口保护/处理程序).在GCC(不确定其他编译器是否支持这个;如果是这样,它将在它们的源中):

通常,它在stdlib中定义:

进一步阅读:


nat*_*soz 8

我遇到了这个问题.这些条件似乎可靠地产生了麻烦:

  1. 没有C/C++标准库的g ++链接:( -nostdlib典型的小嵌入式场景).
  2. 定义静态分配的标准库对象; 具体到我的情况是std::vector.以前这是std::array静态分配没有任何问题.显然,并非所有std::静态分配的对象都会导致问题.
  3. 请注意,我没有使用任何类型的共享库.
  4. GCC/ARM交叉编译器正在使用中.

如果这是您的用例,那么只需将命令行选项添加到您的编译/链接命令行: -fno-use-cxa-atexit

这是一个非常好的链接到__dso_handle用法作为'动态共享对象的句柄'.

页面中似乎有拼写错误,但我不知道联系谁来确认:

在调用对象的构造函数析构函数后,GCC会自动调用函数...

我认为这应该是"一旦所有析构函数都被称为GCC调用函数"......

确认这一点的一种方法是实现上述__cxa_atexit功能,然后单步执行该程序并查看其调用位置.我会尝试这些日子之一,但不是现在.