LD.SO(8)

ИМЯ
ld.so, ld-linux.so* - динамический связыватель/загрузчик

ОБЗОР
Программы ld.so и ld-linux.so* ищут и загружают динамические библиотеки, необходимые программам, а также подготавливают программы к запуску и запускают их.

Бинарные файлы Linux требуют динамического связывания (связывания в момент запуска) за исключением тех, что во время компиляции были собраны с опцией -static заданной для ld .

Программа ld.so управляет бинарными файлами в формате a.out, который используется очень давно; программа ld-linux.so* управляет файлами в формате ELF (/lib/ld-linux.so.1 для libc5, /lib/ld-linux.so.2 для glibc2), который используется в течении нескольких лет и в данный момент. Обе программы ведут себя одинаково и используют те же самые файлы поддержки, а также программы ldd(1), ldconfig(8) и /etc/ld.so.conf.

Динамические библиотеки, необходимые программе ищутся в нескольких местах:

o   (только для ELF) Используя атрибут DT_RPATH динамической секции бинарного файла, если он есть и если атрибут DT_RUNPATH не существует. Использование DT_RPATH является устаревшей стратегией.

o   Используя переменную окружения LD_LIBRARY_PATH. За исключением случая, когда исполняется бинарный файл с setuid/setgid битом, так как в этом случае она игнорируется.

o   (только для ELF) Используя атрибут DT_RUNPATH динамической секции бинарного файла, если он есть.

o   Из кэш-файла /etc/ld.so.cache, который содержит скомпилированный список библиотек-кандидатов, которые ранее были найдены по указанным путям расположения библиотек. Однако, если бинарный файл был связан с опцией компановщика -z nodeflib , библиотеки в путях по умолчанию, будут пропущены.

o   В путях по умолчанию /lib, и /usr/lib. Если бианрный файл был связан с опцией компановщика -z nodeflib , данный шаг будет пропущен.

ОБЗОР
Динамический связыватель (компановщик) может быть запущен или опосредовано через запуск некоторых программ динамического связывания или библиотек (в этом случае компановщику не могут быть переданы опции командной строки, в случае ELF, компановщик сохраняется в секции .interp запускаемой программы) или непосредственно через запуск:

/lib/ld-linux.so.* [ОПЦИИ] [ПРОГРАММА [АРГУМЕНТЫ]]

ОПЦИИ КОМАНДНОЙ СТРОКИ

--list
    Выдать список всех зависимостей и как они удовлетворяются.

--verify
    Проверить, что программа является динамически связанной и что компановщик может ей управлять.

--library-path PATH
    Перекрыть установки в переменной окружения LD_LIBRARY_PATH (см. ниже).

--ignore-rpath LIST
    Игнорировать информацию в RPATH и RUNPATH в именах объетов в LIST. Данная опция поддерживалась glibc2 буквально один час. Затем она была переименована в:

--inhibit-rpath LIST

ОКРУЖЕНИЕ
Существует четыре важные переменные окружения.

LD_LIBRARY_PATH
    Список разделённых двоеточием каталогов, в которых производится поиск ELF библиотек в момент выполнения. Похоже на переменную окружения PATH .

LD_PRELOAD
    Заданный пользователем список дополнительных динамических ELF библиотек, разделённых пробелами, которые будут загружены перед всеми другими. Это можно использовать для выборочного перекрытия функций в других динамических библиотеках. Для бинарных файлов setuid/setgid, будут загружены только библиотеки в стандартных каталогах поиска и которые также имеют setuid.

LD_BIND_NOW
    (libc5; glibc с версии 2.1.1) Если переменная содержит непустую строку, то компановщик будет искать все символы в запускаемой программе, вместо того, чтобы отложить поиск вызовов функций до момента, когда они встретятся в первый раз. Это полезно использовать при отладке.

LD_TRACE_LOADED_OBJECTS
    (только для ELF) Если переменная содержит непустую строку, то программа вместо нормального запуска выдаст свои зависимости по динамическим библиотекам, как если бы она была запущена через ldd(1).

Далее, существует большое количество более или менее значительных переменных, многие из которых устарели или предназначены только для внутреннего использования.

LD_WARN
    (только для ELF)(glibc с версии 2.1.3) Если переменная содержит непустую строку, будут выданы предупреждения о ненайденных символах.

LD_NOWARN
    (только a.out)(libc5) Подавлять предупреждения о бибилиотеках a.out с несовместимыми номерами версий.

LD_BIND_NOT
    (glibc начиная с 2.1.95) Не обновлять GOT (global offset table - глобальную таблицу смещений) и PLT (procedure linkage table - таблицу процедурных связываний) после нахождения символа.

LD_DEBUG
    (glibc начаная с 2.1) Выводить подробную отладочную информацию о компановщике. Если установлена в значение all , то выдает всю имеющуюся отладочную информацию, если установлена в help , то выдает вспомогательные сообщения о некоторых категориях, которые могут быть указаны в этой переменной окружения.

LD_DEBUG_OUTPUT
    (glibc начиная с 2.1) Файл куда будет записываться вывод LD_DEBUG : по умолчанию это стандартный вывод. LD_DEBUG_OUTPUT игнорируется для бинарных файлов setuid/setgid.

LD_VERBOSE
    (glibc начиная с 2.1) Если переменная содержит непустую строку, будет выводиться информация о версиях символов в программе, если выбран режим запроса информации о программе (т.е. или задана переменная LD_TRACE_LOADED_OBJECTS или для компановщика заданы опции --list и --verify ).

LD_PROFILE
    (glibc начиная с 2.1) Динамический объект для профилирования.

LD_PROFILE_OUTPUT
    (glibc начиная с 2.1) Файл, куда будет сохраняться вывод для LD_PROFILE : по умолчанию это стандартный вывод. LD_DEBUG_OUTPUT игнорируется для бинарных файлов setuid/setgid.

LD_AOUT_LIBRARY_PATH
    (libc5) Версия LD_LIBRARY_PATH только для бинарных файлов формата a.out. Старые версии ld-linux.so.1 также поддерживают LD_ELF_LIBRARY_PATH.

LD_AOUT_PRELOAD
    (libc5) Версия LD_PRELOAD только для бинарных файлов формата a.out. Старые версии ld-linux.so.1 также поддерживают LD_ELF_PRELOAD.

LD_SHOW_AUXV
    (glibc начиная с 2.1) Показывать вспомогательный массив, передаваемый из ядра.

LD_HWCAP_MASK
    (glibc начиная 2.1) Маска для совместимости с аппаратными возможностями.

LD_ORIGIN_PATH
    (glibc начиная 2.1) Путь, где находится библиотека (для не-setuid программ).

LD_DYNAMIC_WEAK
    (glibc начиная с 2.1.91) Разрешает перекрытие слабых символов (возвращая к поведению старой glibc).

LD_KEEPDIR
    (только для a.out)(libc5) Не игнорировать каталог для загрузки в именах a.out библиотек. Использование этой опции очень не рекомендуется.

LDD_ARGV0
    (libc5) argv[0] для использования ldd(1), когда он не задан.

ФАЙЛЫ
/lib/ld.so
    динамический связыватель/загрузчик для формата a.out
/lib/ld-linux.so.{1,2}
    динамический связыватель/загрузчик для формата ELF
/etc/ld.so.cache
    Файл, содержащий скомпилированный список каталогов, в которых производится поиск библиотек и сортированный список библиотек-кандидатов.
/etc/ld.so.preload
    Файл, содержащий список разделённых пробелами динамических ELF библиотек, которые будут загружены перед программой.
lib*.so*
    динамические библиотеки

ЗАМЕЧАНИЯ
Функциональность ld.so доступна для исполняемых программ, скомпилированных с использованием libc версии 4.4.3 или выше. Функциональность ELF доступна начиная с Linux 1.1.52 и libc5.

СМОТРИ ТАКЖЕ
ldd(1), ldconfig(8)

ПЕРЕВОД
Перевёл с английского Виктор Вислобоков <corochoone@perm.ru> 2003