Русская Википедия:Crt0
Шаблон:Заголовок со строчной буквы Шаблон:Mono (также известный как Шаблон:Mono) — набор стартовых подпрограмм, принудительно линкованных в программу, написанной на Си. Crt0 выполняет инициализирующую работу, необходимую перед вызовом основной функции.
Типы и использование
Crt0 обычно принимает форму объектного файла с именем Шаблон:Mono, часто написанного на языке ассемблера, который автоматически включается линковщиком в каждый скомпонованный им исполняемый файл[1].
crt0 содержит основные части библиотеки среды выполнения. Работа, которую он выполняет, зависит от компилятора, операционной системы и реализации стандартной библиотеки.[1] Кроме работы по инициализации, которая требуется средой и набором инструментов, crt0 может выполнять и дополнительные операции, определенные программистом, такие как исполнение глобальных конструкторов C++ и функций языка Си, имеющие аттрибут Шаблон:Mono.
«crt» означает «время выполнения Си», а ноль подразумевает «самое начало». Однако, когда программы компилируются с помощью GCC, он также используется в отличных от Си языках. Альтернативные версии Шаблон:Mono доступны для специальных сценариев использования; например, чтобы включить профилирование с помощью gprof, программы должны быть скомпилированы с Шаблон:Mono.[2]
Пример crt0.s
Этот пример предназначен только для Linux x86-64 с синтаксисом AT&T без актуальной среды выполнения Си.
.text
.globl _start
_start: # _start is the entry point known to the linker
xor %ebp, %ebp # effectively RBP := 0, mark the end of stack frames
mov (%rsp), %edi # get argc from the stack (implicitly zero-extended to 64-bit)
lea 8(%rsp), %rsi # take the address of argv from the stack
lea 16(%rsp,%rdi,8), %rdx # take the address of envp from the stack
xor %eax, %eax # per ABI and compatibility with icc
call main # %edi, %rsi, %rdx are the three args (of which first two are C standard) to main
mov %eax, %edi # transfer the return of main to the first argument of _exit
xor %eax, %eax # per ABI and compatibility with icc
call _exit # terminate the program
См. также
Примечания