【问题标题】:What is _init in profiling result分析结果中的 _init 是什么
【发布时间】:2021-02-01 22:40:45
【问题描述】:

我在个人资料结果中看到了一个奇怪的函数 (_init):

在父函数中有一个uint64_t 初始化和一些数学运算(求和、乘...)。

_init 函数是什么?和那个uint64_tinit有关系吗?

编辑:我正在使用gcc version 8.3.0

【问题讨论】:

  • 以下划线开头的标识符通常是编译器或标准库实现的内部工作的一部分,因此如果您添加您正在使用的编译器,它可能会对您的问题有所帮助。

标签: c++ linux gcc profiling


【解决方案1】:

_init 是一个在加载共享库时调用的函数。在我们的示例中,它将取决于您链接的库(针对二进制文件运行 ldd 应该会给您一些提示)。

附带说明,_init_fini 函数现在已过时,应替换为 __attribute__ ((constructor))__attribute__ ((destructor))。引用documentation 5.2.1

5.2.1。特殊函数 _init 和 _fini(过时/危险)

历史上有两个特殊函数,_init 和 _fini 可用于控制构造函数和析构函数。但是,它们已经过时,并且它们的使用可能会导致不可预测的结果。你的图书馆不应该使用这些;改用上面的函数属性构造函数和析构函数。

如果您必须使用旧系统或使用 _init 或 _fini 的代码,那么它们的工作方式如下。为初始化和完成模块定义了两个特殊函数:_init 和 _fini。如果函数 ``_init'' 在库中导出,则在首次打开库时调用它(通过 dlopen() 或简单地作为共享库)。在 C 程序中,这只是意味着您定义了一些名为 _init 的函数。有一个名为 _fini 的相应函数,每当客户端完成使用该库时都会调用该函数(通过调用 dlclose() 使其引用计数为零,或在程序正常退出时)。这些函数的 C 原型是:

 void _init(void);
 void _fini(void);

【讨论】:

  • 我没有在我的程序中使用这个函数,如果你确定“加载共享库”部分,那么这个函数是否应该为每个库运行一次?
猜你喜欢
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多