大部分是在“main”程序之前或之后执行代码的方法,其中大部分都存在于文件中(
https://github.com/gcc-mirror/gcc/blob/master/libgcc/crtstuff.c)。它们存在的目的是为了支持各种类C编程语言的特性,但也可以在C中使用。这可能看起来过于复杂,因为其中一些代表着遗留负担,而另一些则是为了支持GCC运行的各种不同架构所需的变化。
从您的列表中,逐个介绍(或两个一组):
00000000004003f0 t deregister_tm_clones
0000000000400430 t register_tm_clones
Transactional memory旨在让使用线程编程更加简单。它是一种替代基于锁的同步的方法。这些例程分别拆除和设置库(libitm)使用的表格,支持这些函数。更多有关TM的信息请参见https://gcc.gnu.org/wiki/TransactionalMemory和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
调用。
.eh_frame
信息基础用于异常处理和类似功能(例如使用
__attribute__((cleanup(..)))
声明的函数)。
00000000004004e0 T __libc_csu_init
0000000000400550 T __libc_csu_fini
这些代码运行程序级别的初始化和终结器(类似于整个程序的构造函数/析构函数)。
如果您定义了以下函数:
void __attribute__ ((constructor)) mefirst () {
}
void __attribute__ ((destructor)) melast () {
}
这些程序将会在main()
函数之前和之后被调用。
另请参阅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)。
0000000000600670 t __do_global_dtors_aux_fini_array_entry
0000000000600670 t __init_array_end
这些标记标志着
.fini_array
段的结束和开始,其中包含指向所有程序级终结器(请参见上面的
__libc_csu_fini)的指针。
[编辑] 一些附加说明: