Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

初始化和终止例程

动态目标文件可以提供用于运行时初始化和终止处理的代码。每次在进程中装入动态目标文件时,都会执行一次动态目标文件的初始化代码。每次在进程中卸载动态目标文件或进程终止时,都会执行一次动态目标文件的终止代码。

在将控制权转交给应用程序之前,运行时链接程序将处理应用程序中找到的所有初始化节及所有装入的依赖项。如果在进程执行期间装入新动态目标文件,则会在装入该目标文件的过程中处理其初始化节。初始化节 .preinit_array.init_array.init 由链接编辑器在生成动态目标文件时创建。

运行时链接程序执行的函数的地址包含在 .preinit_array.init_array 节中。这些函数的执行顺序与其地址在数组中的显示顺序相同。运行时链接程序将 .init 节作为单独的函数执行。如果某目标文件同时包含 .init 节和 .init_array 节,则会首先处理 .init 节,然后再处理该目标文件的 .init_array 节定义的函数。

动态可执行文件可在 .preinit_array 节中提供预初始化函数。这些函数将在运行时链接程序生成进程映像并执行重定位之后但执行任何其他初始化函数之前执行。预初始化函数不允许在共享目标文件中执行。


注 - 编译器驱动程序提供的进程启动机制通过应用程序来调用动态可执行文件中的任何 .init 节。执行所有依赖项初始化节之后,最后会调用动态可执行文件中的 .init 节。

动态目标文件还可提供终止节。终止节 .fini_array.fini 由链接编辑器在生成动态目标文件时创建。

所有终止节都传递给 atexit(3C)。当进程调用 exit(2) 时,将调用这些终止例程。使用 dlclose(3C) 从运行的进程中删除目标文件时,也会调用终止节。

运行时链接程序执行的函数的地址包含在 .fini_array 节中。这些函数的执行顺序与其地址在数组中的显示顺序相反。运行时链接程序将 .fini 节作为单独的函数执行。如果某目标文件同时包含 .fini 节和 .fini_array 节,则会首先处理 .fini_array 节定义的函数,然后再处理该目标文件的 .fini 节。


注 - 编译器驱动程序提供的进程终止机制通过应用程序来调用动态可执行文件中的任何 .fini 节。在执行所有依赖项终止节之前,首先会调用动态可执行文件的 .fini 节。

有关链接编辑器创建初始化节和终止节的更多信息,请参见初始化节和终止节