【问题标题】:Where is __dso_handle defined?__dso_handle 在哪里定义?
【发布时间】:2016-03-22 09:28:00
【问题描述】:

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

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

我尝试链接它,但仍然出现错误。

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

【问题讨论】:

    标签: linker llvm libstdc++


    【解决方案1】:

    __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 中(不确定其他编译器是否支持这一点;如果支持,它将在他们的源代码中):

    通常,它是在标准库中定义的:

    进一步阅读:

    【讨论】:

    • 似乎已修复@ijustlovemath
    【解决方案2】:

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

    1. 没有 C/C++ 标准库的 g++ 链接:-nostdlib(典型的小型嵌入式场景)。
    2. 定义一个静态分配的标准库对象;具体到我的情况是std::vector。以前这是std::array 静态分配的,没有任何问题。显然并非所有std:: 静态分配的对象都会导致问题。
    3. 请注意,我没有使用任何类型的共享库。
    4. GCC/ARM cross compiler 正在使用中。

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

    这是__dso_handle usage as 'handle to dynamic shared object' 的一个很好的链接。

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

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

    我认为这应该是“一旦调用了所有析构函数,GCC 就会调用函数”......

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

    【讨论】:

    • 考虑到其他答案,这会导致内存泄漏吗?
    【解决方案3】:

    添加到@natersoz 的答案-

    对我来说,使用 -Wabi-tag -D_GLIBCXX_USE_CXX11_ABI=0-fno-use-cxa-atexit 有助于编译旧的库。一个迹象是错误消息中的 C++ 函数是否由于 ABI change 而在其中包含 std::__cxx11

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-19
      • 2016-12-31
      • 2011-10-08
      • 2010-09-30
      • 2013-04-04
      • 2019-01-01
      • 2019-07-09
      相关资源
      最近更新 更多