Для программ с динамической связью ядро обнаруживает заголовок PT_INTERP
в файле ELF и сначала отображает динамический компоновщик (/lib/ld-linux.so.2
или аналогичный) и начинает выполнение по адресу e_entry
из основного заголовка ELF динамический компоновщик. Начальное состояние стека содержит информацию, необходимую динамическому компоновщику для поиска двоичного файла основной программы (уже в памяти). Он отвечает за чтение и поиск всех дополнительных библиотек, которые должны быть загружены, загрузку их, выполнение перемещений и переход на адрес e_entry
основной программы.
Для статически связанных программ ядро напрямую использует адрес e_entry
из заголовка ELF основной программы.
В любом случае основная программа начинается с подпрограммы, написанной на ассемблере, которая обычно называется _start
(но имя не важно, если ее адрес находится в поле e_entry
заголовка ELF). Он использует начальное содержимое стека для определения argc
, argv
, environ
и т. Д. И вызывает правильные внутренние функции реализации (обычно написанные на C) для запуска глобальных конструкторов (если таковые имеются) и выполнения любой необходимой инициализации libc. до входа в main
. Обычно это заканчивается звонком на exit(main(argc, argv));
или эквивалентным.