Я думал первым, пока не прочитал следующую цитату, и теперь я не уверен.
Это сложно (и зависит именно от того, что вы называете "динамическое связывание").
Ядро Linux загружает a.out
в память.Затем он проверяет сегмент PT_INTERP
(если есть).
Если этот сегмент отсутствует, двоичный файл статически связан, и ядро передает управление Elf{32,64}Ehdr.e_entry
(обычно подпрограмме _start
).
Если сегмент PT_INTERP
присутствует , ядро загружает его в память и передает управление на , это .e_entry
.Именно здесь начинается динамическое связывание .
Динамический загрузчик перемещает себя, а затем ищет в сегменте a.out
s PT_DYNAMIC
инструкции о том, что еще необходимо.
Например, он обычно находит одну или несколько записей DT_NEEDED
- общие библиотеки, с которыми a.out
была напрямую связана.Загрузчик загружает любые такие библиотеки, инициализирует их и разрешает любые ссылки data между ними.
IF a.out
s PT_DYNAMIC
имеет запись DT_FLAGS
и если эта запись содержит флаг DF_BIND_NOW
, то функция ссылки из a.out
также будут разрешены.В противном случае (и при условии, что LD_BIND_NOW
не установлен в среде), будет выполняться отложенное разрешение PLT
(разрешение функций как часть первого вызова любой данной функции).Подробности здесь .
Когда выполняется заглушка, она проверяет, находится ли необходимая подпрограмма в памяти.Если это не так, программа загружает подпрограмму в память.
Я не знаю, из какой книги вы цитируете, но текущая ОС UNIX не работает таким образом.