这些大多数是在“主”程序本身之前或之后执行代码的各种方法,大多数都在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
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部分调用.
.eh_frame信息库用于异常处理和类似功能(例如使用__attribute __((cleanup(..))声明的函数)).
00000000004004e0 T __libc_csu_init
0000000000400550 T __libc_csu_fini
这些运行任何程序级的初始化器和finalizer(类似于整个程序的构造函数/析构函数).
如果定义如下功能:
void __attribute__ ((constructor)) mefirst () {
/* ... do something here ... */
}
void __attribute__ ((destructor)) melast () {
/* ... do something here ... */
}
0000000000400554 T _fini
这是一个现在不推荐使用的方式来运行程序级(实际上是目标文件级)析构函数(有关这方面的信息可以在man dlclose中找到).
构造函数的相应过时函数是__init.
0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start
这些标记了.init_array部分的结尾和开头,该部分包含指向所有程序级初始化器的指针(参见上面的__libc_csu_init).
这些标记了.fini_array部分的结束和开始,其中包含指向所有程序级终结器的指针(参见上面的__libc_csu_fini).
[编辑]一些附加说明:
>链接
http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html从Jester的问题评论包含一个很好的图和一个小样本程序说明了这些东西运行的总体顺序以及如何运行从C访问这些功能中的一些功能>术语’ctors’和’dtors’是缩写“构造函数”和“析构函数”.>全局构造函数/析构函数和对象文件之间的区别当程序出现时,构造函数/析构函数最为明显从多个目标文件构建.>标记为’T’的符号(__libc_csu_init,__libc_csu_fini,_fini)是“全局”(外部可见),剩余(标记为’t’)不是.0000000000000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start
70 t __do_global_dtors_aux_fini_array_entry
000000000
0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start70 t __init_array_end