Created
October 6, 2018 02:36
-
-
Save k3170makan/56d3c3442ec3109d1341883a56d5290e to your computer and use it in GitHub Desktop.
extract from elf/dl-fini.c#L0-137
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| void | |
| _dl_fini (void) | |
| { | |
| /* Lots of fun ahead. We have to call the destructors for all still | |
| loaded objects, in all namespaces. The problem is that the ELF | |
| specification now demands that dependencies between the modules | |
| are taken into account. I.e., the destructor for a module is | |
| called before the ones for any of its dependencies. | |
| To make things more complicated, we cannot simply use the reverse | |
| order of the constructors. Since the user might have loaded objects | |
| using `dlopen' there are possibly several other modules with its | |
| dependencies to be taken into account. Therefore we have to start | |
| determining the order of the modules once again from the beginning. */ | |
| /* We run the destructors of the main namespaces last. As for the | |
| other namespaces, we pick run the destructors in them in reverse | |
| order of the namespace ID. */ | |
| #ifdef SHARED | |
| int do_audit = 0; | |
| again: | |
| .... snippity snipp snip ..... | |
| /* First see whether an array is given. */ | |
| 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]) (); | |
| } | |
| /* Next try the old-style destructor. */ | |
| if (l->l_info[DT_FINI] != NULL) | |
| DL_CALL_DT_FINI | |
| (l, l->l_addr + l->l_info[DT_FINI]->d_un.d_ptr); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment