Почему конструкторы уровня программы вызываются `__libc_csu_init`, а деструкторы не вызываются` __libc_csu_fini`? - PullRequest
8 голосов
/ 07 мая 2020

Вот простая программа:

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?

...