gcc添加到linux ELF的function是什么?

当在c(或asm)中用gcc链接一个类似hello-world的程序时,它会在结果可执行文件中添加一些东西。 我只知道运行时dynamic链接器和_start入口点,但是这些附加函数是什么types?

 00000000004003f0 t deregister_tm_clones 0000000000400430 t register_tm_clones 0000000000400470 t __do_global_dtors_aux 0000000000400490 t frame_dummy 00000000004004e0 T __libc_csu_init 0000000000400550 T __libc_csu_fini 0000000000400554 T _fini 0000000000600668 t __frame_dummy_init_array_entry 0000000000600668 t __init_array_start 0000000000600670 t __do_global_dtors_aux_fini_array_entry 0000000000600670 t __init_array_end 

他们是什么和为了什么? 是在什么地方描述的? 谷歌search没有帮助。

Solutions Collecting From Web of "gcc添加到linux ELF的function是什么?"

其中大多数是在“main”程序本身之前或之后执行代码的各种方法,并且大部分都在crtstuff.chttps://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这里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部分可能是不可靠的,因此这个函数不会直接从.init section调用__register_frame_info_bases.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

 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 )。

[编辑]一些附加说明: