__dso_handle在哪里定义?

时间:2015-12-16 09:51:56

标签: linker llvm libstdc++

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

nm on libstdc++.so.6的以下结果是否意味着包含该内容?

我试图链接它,但错误仍然存​​在。

nm libstdc++.so.6 | grep dso
00000000002fc480 d __dso_handle

2 个答案:

答案 0 :(得分:14)

__dso_handleused to identify dynamic shared objects during global destruction的“后卫”。

实际上,你应该在这里停止阅读。如果你试图通过弄乱__dso_handle来打败对象识别,那么可能会出现问题。

但是,既然你问过它的定义:答案很复杂。要显示其定义的位置(对于GCC),请在C ++文件中使用iostream,然后执行extern int __dso_handle;。由于类型冲突,这应该表明声明的位置(请参阅this forum thread来源)。

有时,它是defined manually

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

通常,它在stdlib中定义:

进一步阅读:

答案 1 :(得分:5)

我遇到了这个问题。以下是可靠地产生问题的条件:

  1. 没有C / C ++标准库的g ++链接:-nostdlib(典型的小型嵌入式场景)。
  2. 定义静态分配的标准库对象;具体到我的情况是std::vector。以前这是std::array静态分配没有任何问题。显然,并非所有std::静态分配的对象都会导致问题。
  3. 请注意,我没有使用任何类型的共享库。
  4. GCC/ARM cross compiler正在使用中。
  5. 如果这是您的用例,那么只需将命令行选项添加到您的编译/链接命令行:-fno-use-cxa-atexit

    这是指向__dso_handle usage as 'handle to dynamic shared object'的非常好的链接。

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

    在您调用了对象之后'构造函数析构函数GCC自动调用函数...

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

    确认这一点的一种方法是实现所提到的__cxa_atexit函数,然后单步执行程序并查看它的调用位置。我会尝试这一天,但不是现在。