/* This function will be called during normal program termination * to run the destructors that are listed in the .fini_array section * of the executable, if any. * * 'fini_array' points to a list of function addresses. The first * entry in the list has value -1, the last one has value 0. */ void __libc_fini(void* array) { typedef void (*Dtor)(); Dtor* fini_array = reinterpret_cast<Dtor*>(array); const Dtor minus1 = reinterpret_cast<Dtor>(static_cast<uintptr_t>(-1)); // Sanity check - first entry must be -1. if (array == NULL || fini_array[0] != minus1) { return; } // Skip over it. fini_array += 1; // Count the number of destructors. int count = 0; while (fini_array[count] != NULL) { ++count; } // Now call each destructor in reverse order. while (count > 0) { Dtor dtor = fini_array[--count]; // Sanity check, any -1 in the list is ignored. if (dtor == minus1) { continue; } dtor(); } #ifndef LIBC_STATIC { extern void __libc_postfini(void) __attribute__((weak)); if (__libc_postfini) { __libc_postfini(); } } #endif }
/* This function will be called during normal program termination * to run the destructors that are listed in the .fini_array section * of the executable, if any. * * 'fini_array' points to a list of function addresses. The first * entry in the list has value -1, the last one has value 0. */ void __libc_fini(void* array) { void** fini_array = reinterpret_cast<void**>(array); const size_t minus1 = ~(size_t)0; /* ensure proper sign extension */ /* Sanity check - first entry must be -1 */ if (array == NULL || (size_t)fini_array[0] != minus1) { return; } /* skip over it */ fini_array += 1; /* Count the number of destructors. */ int count = 0; while (fini_array[count] != NULL) { ++count; } /* Now call each destructor in reverse order. */ while (count > 0) { void (*func)() = (void (*)()) fini_array[--count]; /* Sanity check, any -1 in the list is ignored */ if ((size_t)func == minus1) { continue; } func(); } #ifndef LIBC_STATIC { extern void __libc_postfini(void) __attribute__((weak)); if (__libc_postfini) { __libc_postfini(); } } #endif }