/* * _atexit_hook — указатель на разматыватель цепочки atexit; его дёргает * crt0 при ВОЗВРАТЕ ИЗ main. * * ЗАЧЕМ КОСВЕННОСТЬ. По стандарту C возврат из main эквивалентен * exit(status), то есть цепочка atexit обязана размотаться. Но прямая * ссылка crt0 на разматыватель притащила бы в КАЖДУЮ программу и его, и * весь стек хендлеров — включая те, что atexit() не зовут вовсе. Поэтому * crt0 ссылается на этот модуль (два байта _DATA, ни байта кода), а * заполняет указатель сам atexit() при первой регистрации: нет * регистраций — указатель нулевой, разматыватель в программу не приезжает, * crt0 просто уходит в ESTEX EXIT как раньше. Тот же приём, что у * _irq_cbl_hook в libc/irq. */ #include "_atexit.h" void (*_atexit_hook)(void);