例
ctorsはconstructors、dtorsはdestructorsの略称です.
exitを呼ぶと、
-
_fini
->do_dtors
-
_exit
- プロセスが消滅するので、
printf("never\n")
は実行されません.
- プロセスが消滅するので、
等が実行されます.
_fini
はcrt1.c:_start
でatexit(_fini)
している.
atexitで登録された関数はプログラムの終了時に呼ばれます.
#include <stdio.h>
#include <stdlib.h>
int count = 0;
void init1()
{
count++;
printf("ctors test. (init1)\n");
}
void init2()
{
count++;
count++;
printf("ctors test. (init2)\n");
}
void fini1()
{
printf("dtors test. (fini1)\n");
}
void fini2()
{
printf("dtors test. (fini2)\n");
}
void fini3()
{
printf("atexit test. (fini3)\n");
}
void (*fp1) (void) __attribute__((section(".ctors"))) = init1;
void (*fp2) (void) __attribute__((section(".ctors"))) = init2;
void (*fp3) (void) __attribute__((section(".dtors"))) = fini1;
void (*fp4) (void) __attribute__((section(".dtors"))) = fini2;
int main()
{
atexit(fini3);
printf("%d\n", count);
exit (0);
printf("never\n");
}
$ clang ctors.c
$ ./a.out
ctors test. (init2)
ctors test. (init1)
3
atexit test. (fini3)
dtors test. (fini1)
dtors test. (fini2)