尝试编译我的程序时,我有一个未解决的符号错误,抱怨它无法找到__dso_handle
.这个函数通常定义在哪个库中?
以下结果是否nm on libstdc++.so.6
意味着包含它?
我试图链接它,但错误仍然发生.
nm libstdc++.so.6 | grep dso 00000000002fc480 d __dso_handle
Zac B.. 15
__dso_handle
是一个"守卫",用于在全局销毁期间识别动态共享对象.
实际上,你应该在这里停止阅读.如果你试图通过搞乱来打败对象识别__dso_handle
,那么可能是非常错误的.
但是,既然你问过它的定义:答案很复杂.要表示其定义的位置(对于GCC),请iostream
在C++文件中使用,然后执行extern int __dso_handle;
.由于类型冲突,这应该表明声明的位置(请参阅此论坛帖子获取源代码).
有时,它是手动定义的.
有时,它是由编译器安装的"运行时"定义/提供的(实际上,CRT通常只是一堆二进制头/入口点管理代码,以及一些出口保护/处理程序).在GCC(不确定其他编译器是否支持这个;如果是这样,它将在它们的源中):
主要定义
测试__dso_handle
更换/跟踪器示例1
测试__dso_handle
更换/跟踪器示例2
通常,它在stdlib中定义:
Android的
BSD
进一步阅读:
__dso_handle
在某些编译器中无法访问导致的细微错误
natersoz.. 8
我遇到了这个问题.这些条件似乎可靠地产生了麻烦:
没有C/C++标准库的g ++链接:( -nostdlib
典型的小嵌入式场景).
定义静态分配的标准库对象; 具体到我的情况是std::vector
.以前这是std::array
静态分配没有任何问题.显然,并非所有std::
静态分配的对象都会导致问题.
请注意,我没有使用任何类型的共享库.
GCC/ARM交叉编译器正在使用中.
如果这是您的用例,那么只需将命令行选项添加到您的编译/链接命令行: -fno-use-cxa-atexit
这是一个非常好的链接到__dso_handle用法作为'动态共享对象的句柄'.
页面中似乎有拼写错误,但我不知道联系谁来确认:
在调用对象的构造函数析构函数后,GCC会自动调用函数...
我认为这应该是"一旦所有析构函数都被称为GCC调用函数"......
确认这一点的一种方法是实现上述__cxa_atexit
功能,然后单步执行该程序并查看其调用位置.我会尝试这些日子之一,但不是现在.
__dso_handle
是一个"守卫",用于在全局销毁期间识别动态共享对象.
实际上,你应该在这里停止阅读.如果你试图通过搞乱来打败对象识别__dso_handle
,那么可能是非常错误的.
但是,既然你问过它的定义:答案很复杂.要表示其定义的位置(对于GCC),请iostream
在C++文件中使用,然后执行extern int __dso_handle;
.由于类型冲突,这应该表明声明的位置(请参阅此论坛帖子获取源代码).
有时,它是手动定义的.
有时,它是由编译器安装的"运行时"定义/提供的(实际上,CRT通常只是一堆二进制头/入口点管理代码,以及一些出口保护/处理程序).在GCC(不确定其他编译器是否支持这个;如果是这样,它将在它们的源中):
主要定义
测试__dso_handle
更换/跟踪器示例1
测试__dso_handle
更换/跟踪器示例2
通常,它在stdlib中定义:
Android的
BSD
进一步阅读:
__dso_handle
在某些编译器中无法访问导致的细微错误
我遇到了这个问题.这些条件似乎可靠地产生了麻烦:
没有C/C++标准库的g ++链接:( -nostdlib
典型的小嵌入式场景).
定义静态分配的标准库对象; 具体到我的情况是std::vector
.以前这是std::array
静态分配没有任何问题.显然,并非所有std::
静态分配的对象都会导致问题.
请注意,我没有使用任何类型的共享库.
GCC/ARM交叉编译器正在使用中.
如果这是您的用例,那么只需将命令行选项添加到您的编译/链接命令行: -fno-use-cxa-atexit
这是一个非常好的链接到__dso_handle用法作为'动态共享对象的句柄'.
页面中似乎有拼写错误,但我不知道联系谁来确认:
在调用对象的构造函数析构函数后,GCC会自动调用函数...
我认为这应该是"一旦所有析构函数都被称为GCC调用函数"......
确认这一点的一种方法是实现上述__cxa_atexit
功能,然后单步执行该程序并查看其调用位置.我会尝试这些日子之一,但不是现在.