什么是 __dso_handle 以及为什么需要定义它才能链接到工作?

问题描述 投票:0回答:1

我最近尝试用 C 和 C++ 为 AWS 机器构建一些文件,并收到链接器错误

__dso_handle is not defined
。这让我困惑了一段时间,因为我回顾了几篇提到它的文章,包括__dso_handle在哪里定义?modm-io/modm#793。我所收集到的只是它以某种方式用于在全局范围内释放静态对象,C++ 库中的某些东西需要它,并且通常它是在某个模糊的位置定义的,但并非总是如此。我最终被指示,作为目前快速而肮脏的黑客,将以下行放入 .cpp 文件中:

extern "C" void *__dso_handle = NULL;

现在这个符号已经定义了,链接就成功了。有人告诉我,这不是一个合适的长期解决方案,事实上,根据上面的 SO 链接:

如果您试图通过弄乱
__dso_handle

来击败对象识别,则可能存在严重错误。


确实,可能是这样。我的问题是:

  1. __dso_handle

    变量的用途到底是什么(最好比上面的SO链接更详细,因为虽然它说了变量是什么,但我不清楚它是如何使用的)。

    
    

  2. 为什么系统无法找到它 - 如果它对于 C++ 标准库的工作如此重要,为什么 C++ 标准库不定义它?
  3. 像上面这样的手动定义可能会出现什么问题(如果有的话)?如果我正确理解了
  4. this

    安腾页面,这意味着当程序退出时它将无法找到对象段的地址,从而无法正确释放它们。

  5. 有什么比像我一样在程序源文件中定义
  6. __dso_handle

    更好的定义方法呢?

    
    

  7. 注意:我无法提供有问题的代码,因为它是专有软件。

c++ c shared-libraries linker-errors static-linking
1个回答
0
投票

如果它对系统如此重要,为什么系统无法找到它? C++ 标准库可以工作,为什么 C++ 标准库不行 定义它?

因为该库从未打算仅在托管环境中的嵌入式裸机系统上使用 - 假设程序正常终止。裸机版本只是改编,仍然存在很多问题。你的问题是错误的(为什么?),因为它从来都不是有意的,而且它是一个随机错误。

__dso_handle 变量的具体用途是什么(最好是 比上面的 SO 链接更详细,因为它说了什么 变量是,我不清楚它是如何使用的)。

裸机系统不使用它,因为它们不退出。不需要

手动定义可能会出错的地方(如果有的话),例如 和上面那个一样?如果我正确理解此安腾页面,则此 意味着它将无法找到对象段的地址 程序退出,因此无法正确释放它们。

这是一个不太完善的标准库移植的肮脏解决方法。我不会将其定义为 NULL,仅作为指向重置 uC 的函数的指针。

© www.soinside.com 2019 - 2024. All rights reserved.