当前位置:  开发笔记 > Android > 正文

__dso_handle在哪里定义?

如何解决《__dso_handle在哪里定义?》经验,为你挑选了2个好方法。

尝试编译我的程序时,我有一个未解决的符号错误,抱怨它无法找到__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功能,然后单步执行该程序并查看其调用位置.我会尝试这些日子之一,但不是现在.



1> Zac B..:

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

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

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

有时,它是手动定义的.

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

主要定义

测试__dso_handle更换/跟踪器示例1

测试__dso_handle更换/跟踪器示例2

通常,它在stdlib中定义:

Android的

BSD

进一步阅读:

__dso_handle在某些编译器中无法访问导致的细微错误



2> natersoz..:

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

    没有C/C++标准库的g ++链接:( -nostdlib典型的小嵌入式场景).

    定义静态分配的标准库对象; 具体到我的情况是std::vector.以前这是std::array静态分配没有任何问题.显然,并非所有std::静态分配的对象都会导致问题.

    请注意,我没有使用任何类型的共享库.

    GCC/ARM交叉编译器正在使用中.

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

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

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

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

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

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

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有