Вопрос или проблема
$ file /lib/ld-linux.so.2
/lib/ld-linux.so.2: символическая ссылка на i386-linux-gnu/ld-2.27.so
$ readlink -f /lib/ld-linux.so.2
/lib/i386-linux-gnu/ld-2.27.so
$ file /lib/i386-linux-gnu/ld-2.27.so
/lib/i386-linux-gnu/ld-2.27.so: ELF 32-битный LSB общий объект, Intel 80386, версия 1 (SYSV), динамически связанный, BuildID[sha1]=7a59ed1836f27b66ffd391d656da6435055f02f8, очищенный
Так является ли ld-2.27.so
общей библиотекой?
Говорят, что это динамический компоновщик/загрузчик и упоминается в разделе 8 справочника. Так является ли это исполняемым файлом?
Если да, почему его назвали как общую библиотеку с расширением *.so
?
Если нет, как мне понять, что это как исполняемый файл, поскольку это динамический компоновщик/загрузчик и упоминается в разделе 8 справочника?
Спасибо.
Это и то, и другое, что совершенно допустимо.
Схема именования в стиле ld.so
в основном историческая; первым динамическим компоновщиком в этом стиле был компоновщик SunOS 4, который был назван ld.so
, потому что это общий объект, отделенный от компоновщика ld
(см. статью 1987 года Общие библиотеки в SunOS, которая содержит отличные описания ограничений и проектных решений и остается актуальной и сегодня). Но есть обоснованные причины для его названия как общей библиотеки, а не исполняемого файла, включая:
- он существует для обслуживания исполняемых файлов, как общие библиотеки (у него нет цели без исполняемых файлов для запуска);
- это общий объект ELF, но он не требует интерпретатора (у него нет записи
.interp
); это типично для библиотек (общие, или, скорее, динамически связанные, исполняемые файлы всегда требуют интерпретатора; в противном случае они статически связаны).
Различие между исполняемыми файлами и библиотеками в ELF несколько размыто; любой объект ELF с точкой входа и/или интерпретатором может быть исполняемым файлом, независимо от его других свойств.
Ответ или решение
ld.so, в частности ld-linux.so.2, представляет собой динамический загрузчик и линкер, который действительно можно считать исполняемым файлом, несмотря на его расширение *.so, обычно ассоциируемое с общими библиотеками. Рассмотрим подробнее, что это значит.
Определение и назначение
-
Исполняемый файл: Это программа, которая может быть выполнена операционной системой. В случае
ld.so
, его роль заключается в связывании и загрузке других исполняемых файлов, что делает его критически важным элементом в архитектуре динамической компоновки программного обеспечения. -
Динамический линкер:
ld.so
отвечает за загрузку необходимых библиотек и их адресацию в памяти в момент запуска программы. Это делает его жизненно важным для работы программ, которые зависят от динамически подключаемых библиотек.
Почему ld.so имеет расширение .so?
Несмотря на то что ld.so
выполняет функции исполняемого файла, его именование и использование суффикса .so
(shared object) происходит исторически из-за следующих причин:
-
Исторические корни: Первые динамические линкеры, такие как тот, который использовался в SunOS 4, были названы
ld.so
из соображений совместимости и понимания. Он представляет собой "общий объект", который был отделён от самого компоновщика, что отражает его двойную природу. -
Совместное использование: Как и совместимые библиотеки,
ld.so
служит промежуточным слоем между исполняемыми файлами и системными библиотеками, облегчая взаимодействие между ними.
Разграничение исполняемых файлов и библиотек
-
Гибридная природа: В формате ELF (Executable and Linkable Format) существует множество категорий объектов, которые могут быть как исполняемыми, так и библиотекой.
ld.so
имеет специальную структуру, которая позволяет ему функционировать как исполняемый файл (он может быть запущен и выполняет код), хотя он и не требует интерпретатора, как это требуется для обычных исполняемых файлов. -
Отсутствие заголовка интерпретатора: В отличие от стандартного исполняемого файла, в котором указано, какой интерпретатор использовать,
ld.so
не имеет секции.interp
. Это делает его значительно более схожим с библиотекой, но не уменьшает его функциональности как исполняемого файла.
Заключение
Таким образом, ld.so
можно считать исполняемым файлом, который выполняет функции динамического линкера и загрузчика. Его именование с помощью суффикса .so
отсылает нас к его историческому контексту и функциональному назначению. Такое многозначное использование терминологии подчеркивает важность понимания нюансов работы обоих типов объектов в контексте программного обеспечения и системного программирования.
В современном программировании такие динамические линкеры, как ld.so
, играют ключевую роль в управлении зависимостями и эффективном использовании ресурсов в операционных системах, что делает их незаменимыми в области разработки и поддержки программного обеспечения.