在glibc中,当一个程序调用glibc中的exit函数时,exit函数内部会调用_dl_fini,而_dl_fini函数会调用程序中的fini_array段的函数指针去执行。查看glibc源码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void internal_function _dl_fini (void) { .......... if (l->l_info[DT_FINI_ARRAY] != NULL) { ElfW(Addr) *array = (ElfW(Addr) *) (l->l_addr + l->l_info[DT_FINI_ARRAY]->d_un.d_ptr); unsigned int i = (l->l_info[DT_FINI_ARRAYSZ]->d_un.d_val / sizeof (ElfW(Addr))); while (i-- > 0) ((fini_t) array[i]) (); } ............ }
|
我们注意到,有一个函数指针数组的遍历调用执行。我们来看看ld.so中相应的汇编。