首页 > 解决方案 > 分析结果中的 _init 是什么

问题描述

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

在此处输入图像描述

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

这是什么_init功能?它与那个uint64_t初始化有关吗?

编辑:我正在使用gcc version 8.3.0

标签: c++linuxgccprofiling

解决方案


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

附带说明一下,_initand_fini函数现在已经过时了,应该用__attribute__ ((constructor))and代替__attribute__ ((destructor))。引用文档 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);

推荐阅读