Вот простая программа:
void __attribute__ ((constructor)) dumb_constructor(){}
void __attribute__ ((destructor)) dumb_destructor(){}
int main() {}
Я компилирую ее со следующими флагами:
g++ -O0 -fverbose-asm -no-pie -g -o main main.cpp
Я проверяю с помощью gdb
, что __libc_csu_init
вызывает функцию, которую я пометил w / constructor:
Breakpoint 1, dumb_constructor () at main.cpp:1
1 void __attribute__ ((constructor)) dumb_constructor(){}
(gdb) bt
#0 dumb_constructor () at main.cpp:1
#1 0x000000000040116d in __libc_csu_init ()
#2 0x00007ffff7abcfb0 in __libc_start_main () from /usr/lib/libc.so.6
#3 0x000000000040104e in _start ()
и я предполагаю, что атрибут destructor
будет означать, что dumb_destructor()
будет вызываться во время __libc_csu_fini
, но этого не происходит:
Breakpoint 1, dumb_destructor () at main.cpp:3
3 void __attribute__ ((destructor)) dumb_destructor(){}
(gdb) bt
#0 dumb_destructor () at main.cpp:3
#1 0x00007ffff7fe242b in _dl_fini () from /lib64/ld-linux-x86-64.so.2
#2 0x00007ffff7ad4537 in __run_exit_handlers () from /usr/lib/libc.so.6
#3 0x00007ffff7ad46ee in exit () from /usr/lib/libc.so.6
#4 0x00007ffff7abd02a in __libc_start_main () from /usr/lib/libc.so.6
#5 0x000000000040104e in _start ()
Я вменяемый проверил, что __libc_csu_fini
действительно ничего не делает с objdump, и это действительно заглушка:
0000000000401190 <__libc_csu_fini>:
401190: f3 0f 1e fa endbr64
401194: c3 ret
Почему мы называем это _dl_fini
? Что такое _dl_fini
? Почему он непоследователен и не набирает __libc_csu_fini
?