crt0

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

crt0 (также известный как c0) — набор стартовых подпрограмм, принудительно линкованных в программу, написанной на Си. Crt0 выполняет инициализирующую работу, необходимую перед вызовом основной функции.

Типы и использование

[править | править код]

Crt0 обычно принимает форму объектного файла с именем crt0.o, часто написанного на языке ассемблера, который автоматически включается линковщиком в каждый скомпонованный им исполняемый файл[1].

crt0 содержит основные части библиотеки среды выполнения. Работа, которую он выполняет, зависит от компилятора, операционной системы и реализации стандартной библиотеки.[1] Кроме работы по инициализации, которая требуется средой и набором инструментов, crt0 может выполнять и дополнительные операции, определенные программистом, такие как исполнение глобальных конструкторов C++ и функций языка Си, имеющие аттрибут ((constructor)).

«crt» означает «C runtime» («время выполнения Си»), а ноль подразумевает «самое начало». Однако, когда программы компилируются с помощью GCC, он также используется в отличных от Си языках. Альтернативные версии crt0 доступны для специальных сценариев использования; например, чтобы включить профилирование с помощью gprof, программы должны быть скомпилированы с gcrt0.[2]

Пример crt0.s

[править | править код]

Этот пример предназначен только для Linux x86-64 с синтаксисом AT&T без актуальной среды выполнения Си.

.text
.globl _start

_start:                      # _start — точка входа, известная компоновщику
  xor %ebp, %ebp             # эффективно RBP := 0, отмечаем конец стековых кадров
  mov (%rsp), %edi           # получить argc из стека (неявно расширенный до 64 бит)
  lea 8(%rsp), %rsi          # взять адрес argv из стека
  lea 16(%rsp,%rdi,8), %rdx  # взять адрес envp из стека
  xor %eax, %eax             # по ABI и совместимость с icc
  call main                  # %edi, %rsi, %rdx — три аргумента (из которых первые два являются стандартными для языка Си) для main
  mov %eax, %edi             # перенести возврат main в первый аргумент _exit
  xor %eax, %eax             # по ABI и совместимость с icc
  call _exit                 # завершить программу

Примечания

[править | править код]
  1. 1 2 The C Runtime Initialization, crt0.o. embecosm.com. Дата обращения: 30 декабря 2013. Архивировано 30 декабря 2013 года.
  2. Compiling a Program for Profiling: GNU gprof. sourceware.org. Дата обращения: 30 декабря 2013. Архивировано 31 декабря 2013 года.