在尝试编译我的程序时,我有一个未解决的符号错误,该程序抱怨它无法找到__dso_handle
。这个函数通常在哪个库中定义?
nm on libstdc++.so.6
的以下结果是否意味着包含该内容?
我试图链接它,但错误仍然存在。
nm libstdc++.so.6 | grep dso
00000000002fc480 d __dso_handle
答案 0 :(得分:14)
__dso_handle
是used to identify dynamic shared objects during global destruction的“后卫”。
实际上,你应该在这里停止阅读。如果你试图通过弄乱__dso_handle
来打败对象识别,那么可能会出现问题。
但是,既然你问过它的定义:答案很复杂。要显示其定义的位置(对于GCC),请在C ++文件中使用iostream
,然后执行extern int __dso_handle;
。由于类型冲突,这应该表明声明的位置(请参阅this forum thread来源)。
有时,它是defined manually。
有时,它是由编译器安装的“运行时”定义/提供的(实际上,CRT通常只是一堆二进制头/入口点管理代码,以及一些退出保护/处理程序)。在GCC(不确定其他编译器是否支持这个;如果是这样,它将在它们的来源中):
__dso_handle
replacement/tracker example 1 __dso_handle
replacement/tracker example 2 通常,它在stdlib中定义:
进一步阅读:
答案 1 :(得分:5)
我遇到了这个问题。以下是可靠地产生问题的条件:
-nostdlib
(典型的小型嵌入式场景)。std::vector
。以前这是std::array
静态分配没有任何问题。显然,并非所有std::
静态分配的对象都会导致问题。如果这是您的用例,那么只需将命令行选项添加到您的编译/链接命令行:-fno-use-cxa-atexit
这是指向__dso_handle usage as 'handle to dynamic shared object'的非常好的链接。
页面上似乎有拼写错误,但我不知道联系谁确认:
在您调用了对象之后'构造函数析构函数GCC自动调用函数...
我认为这应该是"一旦所有析构函数被调用,GCC调用函数" ...
确认这一点的一种方法是实现所提到的__cxa_atexit
函数,然后单步执行程序并查看它的调用位置。我会尝试这一天,但不是现在。