crt0
crt0 (від англ. C runtime 0) — програмний код, що лінкується з програмою на мові програмування C, і виконує початкову ініціалізацію перед викликом функції main. Як правило це об'єктний модуль, що називається crt0.o, часто написаний на мові асемблера. Зазвичай автоматично включається лінкером до виконуваного файлу.[1]
Виконання програми |
---|
Загальні поняття |
|
Типи програмного коду |
Стратегії компіляції |
|
Середовища виконання |
|
Важливі компілятори і інструменти |
|
crt0 містить початкову функціональність бібліотеки середовища виконання, і напряму залежить від компілятора, операційної системи і реалізації стандартної бібліотеки мови C.[1] На додачу до базової ініціалізації crt0 може виконувати додаткові функції, визначені програмістом, такі як виклик глобальних конструкторів C++ або функцій С, що містять атрибут ((constructor)) (специфічний для GCC).[2][3]
Для спеціальних випадків можуть застосовуватися альтернативні версії crt0: наприклад, профілювальник gprof вимагає, щоб програми лінкувалися з модулем gcrt0.[4]
Приклад реалізації
Наступний асемблерний лістинг є простим прикладом 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 ; завершити програму
Джерела
- The C Runtime Initialization, crt0.o. embecosm.com. 2010. Процитовано 30 грудня 2013.
- Program initialization: Creating a C library. osdev.org. 25 лютого 2014. Процитовано 21 квітня 2014.
- Calling Global Constructors. osdev.org. 8 квітня 2014. Процитовано 21 квітня 2014.
- Compiling a Program for Profiling: GNU gprof. sourceware.org. Процитовано 30 грудня 2013.