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                ; завершити програму

Джерела[ред. | ред. код]

  1. а б The C Runtime Initialization, crt0.o. embecosm.com. 2010. Архів оригіналу за 30 грудня 2013. Процитовано 30 грудня 2013.
  2. Program initialization: Creating a C library. osdev.org. 25 лютого 2014. Архів оригіналу за 23 квітня 2014. Процитовано 21 квітня 2014.
  3. Calling Global Constructors. osdev.org. 8 квітня 2014. Архів оригіналу за 23 квітня 2014. Процитовано 21 квітня 2014.
  4. Compiling a Program for Profiling: GNU gprof. sourceware.org. Архів оригіналу за 31 грудня 2013. Процитовано 30 грудня 2013.