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. Процитовано 30 грудня 2013.
- ↑ Program initialization: Creating a C library. osdev.org. 25 лютого 2014. Архів оригіналу за 23 квітня 2014. Процитовано 21 квітня 2014.
- ↑ Calling Global Constructors. osdev.org. 8 квітня 2014. Архів оригіналу за 23 квітня 2014. Процитовано 21 квітня 2014.
- ↑ Compiling a Program for Profiling: GNU gprof. sourceware.org. Архів оригіналу за 31 грудня 2013. Процитовано 30 грудня 2013.