其中大多数是在“主”程序本身之前或之后执行代码的各种方法,并且大多数存在于crtstuff.c
( https://github.com/gcc-mirror/gcc/blob/master/libgcc/crtstuff.c https://github.com/gcc-mirror/gcc/blob/master/libgcc/crtstuff.c)。
它们的存在是为了支持各种类 C 编程语言的功能,但也可以在 C 中访问它们。它可能看起来过于复杂,因为其中一些代表遗留包袱,一些代表支持 GCC 运行的各种不同架构所需的变体。
从您的列表中,一一(或二二):
00000000004003f0 t deregister_tm_clones
0000000000400430 t register_tm_clones
事务内存旨在使线程编程变得更简单。
它是基于锁的同步的替代方案。
这些例程分别拆除和设置支持这些函数的库 (libitm) 使用的表。
有关 TM 的更多信息请点击此处https://gcc.gnu.org/wiki/TransactionalMemory https://gcc.gnu.org/wiki/TransactionalMemory和这里http://pmarlier.free.fr/gcc-tm-tut.html http://pmarlier.free.fr/gcc-tm-tut.html
0000000000400470 t __do_global_dtors_aux
在系统上退出程序时运行所有全局析构函数.fini_array
不可用。
0000000000400490 t frame_dummy
该函数位于.init
部分。它被定义为void frame_dummy ( void )
生命的全部意义就是呼唤__register_frame_info_bases
其中有参数。显然调用带有参数的函数.init
部分可能不可靠,因此这个函数所以__register_frame_info_bases
不会直接从.init section
.
The .eh_frame
信息库用于异常处理和类似的功能(例如用__attribute__((cleanup(..)))
).
00000000004004e0 T __libc_csu_init
0000000000400550 T __libc_csu_fini
它们运行任何程序级初始化程序和终结程序(有点像整个程序的构造函数/析构函数)。
如果您定义如下函数:
void __attribute__ ((constructor)) mefirst () {
/* ... do something here ... */
}
void __attribute__ ((destructor)) melast () {
/* ... do something here ... */
}
他们将在之前和之后被调用main()
分别通过这些例程。
也可以看看https://gcc.gnu.org/onlinedocs/gccint/Initialization.html https://gcc.gnu.org/onlinedocs/gccint/Initialization.html
0000000000400554 T _fini
这是一种现已弃用的运行程序级(实际上是对象文件级)析构函数的方法(有关这方面的一些信息可以在man dlclose
)。
构造函数相应的过时函数是__init
.
0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start
这些标志着整个过程的结束和开始.init_array
部分,其中包含指向所有程序级初始值设定项的指针(请参阅__libc_csu_init above).
0000000000600670 t __do_global_dtors_aux_fini_array_entry
0000000000600670 t __init_array_end
这些标志着整个过程的结束和开始.fini_array
部分,其中包含指向所有程序级终结器的指针(请参阅__libc_csu_fini above).
[EDIT]一些附加说明:
-
链接http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html(回程机) https://web.archive.org/web/20191210114310/http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html来自杰斯特的问题评论包含一个漂亮的图表和一个小样本
程序说明了这些东西运行的总体顺序以及如何运行
从 C 访问其中一些功能。
-
条款 'ctors' and 'dtors' 是缩写
'构造函数' and '析构函数' 分别。
-
全局构造函数/析构函数和对象文件之间的区别
当你的程序是这样的时候,构造函数/析构函数是最明显的
由多个目标文件构建。
-
标记为 ' 的符号T' (__libc_csu_init、__libc_csu_fini、_fini)
是“全局”(外部可见),其余部分(标记为 't') 不是。