咨询GCC编译C程序的退出控制段及.fini_array段的作用
GCC程序退出相关段的说明
一、程序退出时最后执行的逻辑对应段
旧版GCC(比如3.3.6)里的.dtors段用来存储全局、静态对象的析构函数指针,程序退出时会依次调用这些函数。但新版GCC已弃用.dtors和.ctors这类旧段,改用**.fini_array**负责退出阶段的收尾执行,它就是现在程序退出前最后执行的用户态段逻辑。
除此之外,程序退出时还会执行这些流程:
- 调用
atexit()或on_exit()注册的函数,调用顺序与注册顺序相反 - 执行C++全局、静态对象的析构函数(本质也是通过
.fini_array触发) - 操作系统内核层面的进程清理(比如回收内存、关闭文件描述符,这部分不属于用户程序的段)
二、.fini_array段的具体作用
.fini_array是一个存储函数指针的数组,当程序正常退出(比如main函数返回、调用exit())时,C运行时库(crt)会遍历这个数组,依次调用其中的函数。它的核心用途包括:
- 处理全局、静态变量的清理工作,比如C++全局对象的析构
- 执行用
__attribute__((destructor))声明的函数 - 作为旧
.dtors段的替代方案,遵循ELF标准,兼容性和灵活性更好,目前是GCC等现代编译器的标准实现
内容的提问来源于stack exchange,提问作者Vignesh SB
相关产品推荐
相关产品推荐

