(від ) — програмний код, що лінкується з програмою на мові програмування C, і виконує початкову ініціалізацію перед викликом функції . Як правило це об'єктний модуль, що називається , часто написаний на мові асемблера. Зазвичай автоматично включається лінкером до виконуваного файлу.
містить початкову функціональність бібліотеки середовища виконання, і напряму залежить від компілятора, операційної системи і реалізації стандартної бібліотеки мови C. На додачу до базової ініціалізації може виконувати додаткові функції, визначені програмістом, такі як виклик глобальних конструкторів C++ або функцій С, що містять атрибут (специфічний для GCC).
Для спеціальних випадків можуть застосовуватися альтернативні версії : наприклад, профілювальник gprof вимагає, щоб програми лінкувалися з модулем .
Приклад реалізації
Наступний асемблерний лістинг є простим прикладом crt0 для Linux x86-64.
bits 64
section .text
global _start extern main, _exit
; ; Точка входу, відома компонувальнику ; _start: xor ebp, ebp ; очистити EBP (позначає кінець stack frames) mov edi, [rsp] ; завантажити argc зі стеку (неявно розширити нулями до 64 розрядів) lea rsi, [rsp+8] ; завантажити у RSI адресу argv зі стеку lea rdx, [rsp+16+rdi*8] ; завантажити у RDX адресу envp зі стеку xor eax, eax ; для ABI і сумісності з icc call main ; EDI, RSI та RDX — три параметри функції main (перші два є стандартом мови C)
mov edi, eax ; код закінчення у EDI (перший аргумент для _exit) xor eax, eax ; для ABI і сумісності з icc call _exit ; завершити програму
Джерела