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中定义:
进一步阅读:
我遇到了这个问题.这些条件似乎可靠地产生了麻烦:
-nostdlib典型的小嵌入式场景).std::vector.以前这是std::array静态分配没有任何问题.显然,并非所有std::静态分配的对象都会导致问题.如果这是您的用例,那么只需将命令行选项添加到您的编译/链接命令行: -fno-use-cxa-atexit
这是一个非常好的链接到__dso_handle用法作为'动态共享对象的句柄'.
页面中似乎有拼写错误,但我不知道联系谁来确认:
在调用对象的构造函数析构函数后,GCC会自动调用函数...
我认为这应该是"一旦所有析构函数都被称为GCC调用函数"......
确认这一点的一种方法是实现上述__cxa_atexit功能,然后单步执行该程序并查看其调用位置.我会尝试这些日子之一,但不是现在.