Как установить ld linux

Обновлено: 04.07.2024

Затем, если терминал закрыт и перезапущен, ввод echo $LD_LIBRARY_PATH не отображает результат.

Как установить путь навсегда?

внутри файла вы должны написать полный путь к каталогу, который содержит все библиотеки, которые вы хотите добавить в систему, например

Не забудьте добавить только путь к директории, а не полный путь к файлу, все библиотеки внутри этого пути будут автоматически индексироваться.

Сохраните и запустите sudo ldconfig , чтобы обновить систему с помощью этих библиотек.

КОРРЕКЦИЯ: Я должен взять мой собственный совет и фактически прочитать документацию. В нем говорится, что это не относится к LD_LIBRARY_PATH: поскольку Ubuntu 9.04 Jaunty Jackalope, LD_LIBRARY_PATH не может быть установлен в файлах $HOME/.profile,/etc/profile, а также /etc/environment. Вы должны использовать конфигурационные файлы /etc/ld.so.conf.d/.conf. * Таким образом, user1824407 отвечает на вопрос.

Сохраняйте предыдущий путь, не перезаписывайте его:

Вы можете добавить его в свой файл

Файл .bash_profile выполняется только с помощью оболочек входа. Возможно, вам нужно будет поместить его в

/.bashrc или просто выйти из системы и снова войти в систему.

Поместите export LD_LIBRARY_PATH=/usr/local/lib в

/.bashrc [желательно в конец script, чтобы избежать каких-либо переопределений между ними, по умолчанию

/.bashrc поставляется со многими операторами if-else ]

Сообщайте, что всякий раз, когда вы открываете новый терминал/консоль, LD_LIBRARY_PATH будет отображаться

По какой-то причине никто не упомянул о том, что после редактирования bashrc необходимо повторно загрузить. Вы можете либо выйти из системы, либо войти в систему (как указано выше), но вы также можете использовать команды: source

В качестве альтернативы вы можете выполнить программу с указанным библиотекой dir:

    Перейдите в домашнюю папку и отредактируйте файл .profile

Поместите следующую строку в конец

export LD_LIBRARY_PATH=<your path>

Сохранить и выйти.

Выполните эту команду

Я делаю следующее в Mint с 15 по 17, также работает на сервере ubuntu 12.04 и выше:

Все мы привыкли пользоваться программами в любой операционной системе для решения своих задач. Но за функциональностью программ стоит еще одна вещь, с которой мы редко встречаемся при обычной работе с компьютером. Это библиотеки, которые содержат общий набор функций и возможностей, используемых программами. Например, большинство программ, написанных на Си, используют стандартную библиотеку Си, в которой содержатся все основные возможности взаимодействия с системой.

У каждой программы есть свой набор библиотек, которые должны быть в системе чтобы она смогла работать. Иначе бы программистам пришлось заново изобретать различные алгоритмы, писать много кода и разработка программ занимала бы в разы больше времени. В этой статье мы собрали основные библиотеки Linux, а также их предназначение. Эта информация поможет вам лучше освоиться в системе.

Что такое библиотеки?

Как я уже говорил выше - библиотеки реализуют общие возможности, которые потом используются программами. Если говорить просто, то библиотека - это набор функций, каждую из которых можно использовать в любой программе. Например, если программе нужно вывести строку на экран, она не будет лезть прямо в буфер видеокарты, а использует функцию из стандартной библиотеки.

Библиотеки делятся на два типа - динамические и статические. Статические библиотеки linux подключаются на этапе сборки программы, а динамические - во время выполнения и они общие для нескольких программ. Нас будут интересовать именно динамические библиотеки linux. Они находятся в папках /lib, /lib64, /usr/lib, /usr/lib/x86_64-linux-gnu. Каждая библиотека имеет расширение .so, за которым следует номер версии. Этот номер увеличивается каждый раз, когда разработчики вносят серьезные изменения. Такой подход необходим для того, чтобы сохранить совместимость для программ, использующих старые версии. Например, в системе может быть две библиотеки libfuse.so.0 и libfuse.so.1. Далее мы рассмотрим основные библиотеки и их предназначение.

Как получить информацию о библиотеках?

Перед тем как перейти к рассмотрению самих библиотек, вам, наверное, будет интересно, как получить информацию о них и узнать где они находятся в вашей системе. Библиотеки Linux могут быть размещены в различных каталогах, в зависимости от дистрибутива, но посмотреть эти каталоги можно, выполнив:


Во всех перечисленных здесь каталогах находятся статические и динамически библиотеки Linux:

ls -l /lib/x86_64-linux-gnu/


Информацию о зависимостях каждой библиотеки вы можете посмотреть командой ldd:


А еще можно узнать какому пакету принадлежит библиотека в Ubuntu:

dpkg -S /lib/x86_64-linux-gnu/ld-2.24.so

Как видите, библиотека ld.so принадлежит пакету libc6, точнее она входит в набор инструментов Си. Более подробно, о том, как устанавливать новые библиотеки и решать проблемы с ними, описано в статье библиотеки Ubuntu.

Основные библиотеки

Это библиотеки основных языков программирования, которые содержат базовую функциональность для взаимодействия с системой.

  • libanl.so - библиотека работы с DNS;
  • libc.a - основная статическая библиотека языка Си;
  • libdl.a - библиотека, отвечающая за загрузку других библиотек во время запуска программы;
  • libnsl.so - работа со службой NIS;
  • libstdc++.so - стандартная библиотека C++;
  • libutil.so - реализует основные часто используемые функции;
  • libelf.so - библиотека для работы с бинарными файлами ELF;
  • libevent.so - библиотека с реализацией механизма вызова функций после события;
  • libgnutls.so - библиотека с основными методами и возможностями, используемыми в стандартных утилитах Linux;
  • ld-linux.so - главная библиотека, она собрана в виде статической и не имеет зависимостей. Загружает другие библиотеки и исполняемые файлы. Вы можете вызвать эту библиотеку как программу и передать ей адрес исполняемого файла для запуска.

Библиотеки кодеков

Эти библиотеки содержат наборы кодеков для воспроизведения различных медиа данных. Некоторые из них имеют несвободную лицензию или закрытый исходный код:

  • liba52.so - свободный декодер ATSC A/52;
  • libavfilter6.so - библиотека фильтров ffmpeg;
  • libavcodec57.so - библиотека кодеков ffmpeg;
  • libavformat57.so - библиотека форматов ffmpeg;
  • libavutil55.so - библиотека дополнительных функций ffmpeg;
  • libdv.so - программный кодек для DV;
  • libmad.so - MPEG аудио декодер;
  • libmpeg2.so - потоковый декодер видео данных;
  • libmpg123.so - библиотека консольного плеера mpg123;
  • libwebp.so - декодирование формата Webp;
  • libxvidcore.so - медиа кодек MPEG-4.

Звуковые библиотеки

  • libao.so - библиотека проигрывания звука с простым интерфейсом;
  • libasound.so - библиотека взаимодействия со звуковой подсистемой ALSA;
  • libaudio2.so - библиотека работы со звуком, входит в состав ALSA;
  • libespeak.so - библиотека синтеза речи;
  • libpulse.so - библиотека с основными методами PulseAudio;

Работа с архивами

  • libarchive.so - библиотека для работы с архивами различных форматов;
  • liblzma.so - работа с архивами LZMA.

Графические библиотеки

  • libart.so - библиотека с реализацией функций для работы с 3d графикой;
  • libaa.so - библиотека ASCII графики;
  • libgtk-3.so - набор методов графического фреймворка GTK 3;
  • libgd.so - базовые функции работы с графикой и рисования;
  • libgif.so - работа с форматом изображений Gif;
  • libjpeg.so - работа с изображениями Jpeg;
  • libglapi.so - свободная реализация методов для работы с OpenGL;
  • libgtk-x11-2.0.so - набор методов библиотеки GTK 2;
  • libwx_baseu.so, libwx_baseu_net-3.0.so и другие - набор библиотек фремворка создания графических приложений WX;
  • libX11.so - основные методы и функции X сервера;
  • libncurses.so - одна из самых популярных библиотек псевдографики;
  • libQtGui.so, libQt5Svg.so, libQt5Widgets.so и другие - библиотеки фреймворка разработки графических приложений Qt.

Работа с текстом

  • libaspell.so - библиотека проверки орфографии;
  • libfreetype.so - библиотека отрисовки шрифтов;
  • libharfbuzz.so - библиотека обработки символов Unicode;
  • libxml2.so - библиотека разбора XML;
  • libyaml-0.so - библиотека разбора Yaml.

Безопасность

  • libcrack.so - библиотека с реализацией методов перебора паролей для проверки их надежности;
  • libcrypt.so - библиотека, отвечающая за шифрование;
  • libssl3.so - библиотека шифрования SSLv3;
  • libapparmor.so - библиотека управления системой безопасности AppArrmor;
  • libaudit.so - библиотека слежения за состоянием системы и регистрации событий.

Библиотеки драйверов

  • libcups.so - библиотека работы с принтером;
  • libfuse.so - библиотека организации виртуальных файловых систем;
  • libgphoto2.so - библиотека взаимодействия с камерами по USB;
  • libsensors.so - используется для получения информации от датчиков на материнской плате;
  • libudisks2.so - библиотека usisks, которая отвечает за автоматическое монтирование и обнаружение подключенных устройств;
  • libv4l1.so - библиотека работы с веб-камерами;
  • libpci.so - библиотека работы с PCI устройствами;
  • libusb-1.0.so - библиотека управления USB;
  • libdrm.so - библиотека с общими возможностями Direct Rendering Manager, отрисовки графики с помощью видеокарты;
  • libdrm_amdgpu.so - DRM для драйвера AMDGPU;
  • libdrm_intel.so - DRM для карт Intel;
  • libdrm_nouveau.so - свободный DRM для видеокарт Nvidia;
  • libresolv.so - библиотека получения IP адреса по имени хоста;
  • libpcap.so - библиотека анализа и захвата сетевых пакетов;
  • libproxy.so - настройка и управление прокси;

Эмуляция

  • libSDL.so - библиотека эмуляции загрузки компьютера и базовых возможностей BIOS;
  • libwine.so - библиотека прослойки для запуска приложений Windows в Linux.
  • libvirt.so - библиотека управления KVM;

Выводы

В этой статье мы собрали основные библиотеки Linux, которые имеют наибольшее значение для работы операционной системы. Конечно, невозможно перечислить здесь абсолютно все библиотеки, потому что их очень много. Надеюсь эта информация была полезной для вас.

На завершение урок про библиотеки Linux:

В прошлый раз мы с Вами обнаружили, что запуск программ, скомпилированных вместе с динамическими библиотеками, вызывает ошибку:

Первая программа называется ldd. Она выдает на экран список динамических библиотек используемых в программе и их местоположение. В качестве параметра ей сообщается название обследуемой программы. Давайте попробуем использовать ее для нашей программы rezultdyn:

  • libc.so.6 - стандартную библиотеку функций языка C++.
  • ld-linux.so.2 - библиотеку динамической линковки программ ELF формата.
  • libfsdyn.so - нашу динамическую библиотеку функций.

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

Для того, чтобы добавить нашу директорию с библиотекой в список известных директорий надо подредактировать файл /etc/ld.so.conf. Например, у меня этот файл состоит из таких строк:

Во всех этих директории хранятся всеми используемые библиотеки. В этом списке нет лишь одной директории - /lib, которая сама по себе не нуждается в описании, так как она является главной. Получается, что наша библиотека станет "заметной", если поместить ее в один их этих каталогов, либо отдельно описать в отдельном каталоге. Давайте для теста опишем, добавим строку в конец файла ld.so.conf:

У меня этот файл валяется в домашнем каталога пользователя root, у Вас он может быть в другом месте. Теперь после этого динамический линковщик будет знать где можно найти наш файл, но после изменения конфигурационного файла ld.so.conf необходимо, чтобы система перечитала настройки заново. Это делает программа ldconfig. Пробуем запустить нашу программу:

Как видите все заработало :) Если теперь Вы удалите добавленную нами строку и снова запустите ldconfig, то данные о расположении нашей библиотеки исчезнут и будет появляться таже самая ошибка.

Но описанный метод влияет на всю систему в целом и требует доступа администратора системы, т.е. root. А если Вы простой пользователь без сверх возможностей ?!

Для такого случая есть другое безболезненное решение. Это использование специальной переменной среды LD_LIBRARY_PATH, в которой перечисляются все каталоги содержащие пользовательские динамические библиотеки. Для того, чтобы установить эту переменную в командной среде bash надо набрать всего несколько команд. Для начала посмотрим есть ли у нас такая переменная среды:

У меня в ответ выводится пустая строка, означающая, что такой переменной среды нет. Устанавливается она следующим образом:

После этого программа rezultdyn будет прекрасно работать. В случае, если у Вас в системе эта переменная среды уже уставновлена, то, чтобы не испортить ее значение, надо новый каталог прибавить к старому значению. Делается это другой командой:

Если Вы обнулите эту переменную, то снова библиотека перестанет работать:

Вы также параллельно можете зайти в систему под другим пользователем или даже тем же самым, но если Вы захотите просмотреть значение LD_LIBRARY_PATH, то увидите ее прежнее значение. Это означает, что два разных пользователя Linux не могут влиять на работу друг друга, а это и есть самое главное хорошее отличие систем Unix от большинства других систем.

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

ОПИСАНИЕ

Программы ld.so и ld-linux.so* ищут и загружают общие объекты (общие библиотеки), необходимые программе, а также подготавливают программу к запуску и запускают её.

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

Программа 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.

При определении зависимостей общего объекта, динамический компоновщик сначала просматривает каждую строку зависимости в поисках символа косой черты (такое случается, если путь общего объекта с косой чертой был задан во время компоновки). Если косая черта найдена, то строка зависимости воспринимается как путь (относительный или абсолютный), и общий объект загружается исходя из этого пути.

Если в зависимости общего объекта отсутствует косая черта, то поиск выполняется в следующем порядке:

  • (только для ELF) В каталогах, указанных в атрибуте DT_RPATH динамического раздела двоичного файла, если он есть и если атрибут DT_RUNPATH не существует. Использование DT_RPATH не рекомендуется.
  • В переменной окружения LD_LIBRARY_PATH (если исполняемый файл не выполняется в режиме безопасного выполнения; смотрите далее, в этом случае она игнорируется).
  • (только для ELF) В каталогах, указанных в атрибуте DT_RUNPATH динамического раздела двоичного файла, если он есть.
  • В кэш-файле /etc/ld.so.cache, содержащем скомпилированный список кандидатов общих объектов, которые ранее были найдены по указанным путям расположения библиотек. Однако, если при сборке двоичного файла компоновщику был указан параметр -z nodeflib, то общие объекты в путях по умолчанию будут пропущены. Общие объекты, установленные в каталоги для аппаратных возможностей (см. далее) имеют больший приоритет, чем остальные общие объекты.
  • В каталоге по умолчанию /lib и затем в /usr/lib (на некоторых 64-битных архитектурах путь по умолчанию для 64-битных объектов — /lib64 и затем /usr/lib64). Если при сборке двоичного файла компоновщику был указан параметр -z nodeflib, то этот шаг пропускается.

Раскрытие токена rpath

ld.so распознаёт определённые строки согласно спецификации rpath (DT_RPATH или DT_RUNPATH); эти строки заменяются на

$ORIGIN (или $ ) Она раскрывается в каталог, содержащий программу или общий объект. Таким образом, приложение, расположенное в somedir/app может компилироваться с

для того, чтобы оно могло найти связанный общий объект в somedir/lib и не важно где в иерархии каталогов будет находиться somedir. Это облегчает создание приложений «под ключ», которые вместо установки в специальные каталоги, можно просто распаковать в любой каталог, и они всё равно найдут свои общие объекты.

$LIB (или $ ) Она раскрывается в lib или lib64, в зависимости от архитектуры (например, на x86-64 она заменяется на lib64, а на x86-32 она заменяется на lib). $PLATFORM (или $ ) Преобразуется в строку, соответствующую типу процессора узла (например, «x86_64»). На некоторых архитектурах ядро Linux не предоставляет строку платформы динамическому компоновщику. Значение этой строки берётся из значения AT_PLATFORM вспомогательного вектора (смотрите getauxval(3)).

ПАРАМЕТРЫ

--list Выдать список всех зависимостей и как они удовлетворяются. --verify Проверить, что программа является динамически скомпонованной и что компоновщик понимает её формат. --inhibit-cache Не использовать /etc/ld.so.cache. --library-path путь Использовать путь вместо значения переменной окружения LD_LIBRARY_PATH (смотрите далее). --inhibit-rpath список Игнорировать информацию в RPATH и RUNPATH об именах объектов из списка. Этот параметр игнорируется в режиме безопасного выполнения (смотрите далее). --audit список Использовать объекты из списка в качестве аудиторов.

ОКРУЖЕНИЕ

На поведение динамического компоновщика влияют различные переменные окружения.

Безопасный режим выполнения

По соображением безопасности, влияние некоторых переменных окружения отменяется или изменяется, если динамический компоновщик определяет, что двоичный файл должен выполняться в режиме безопасного выполнения. Такое решение исполняется после проверки, что запись AT_SECURE во вспомогательном векторе (смотрите getauxval(3)) не равна нулю. Данная запись содержит ненулевое значение по различным причинам, включая: * У процесса различаются реальный и эффективный идентификатор пользователя/группы. Обычно, это происходит в результате выполнения программ с установленным битом set-user-ID или set-group-ID. * Процесс с пользовательским ID не равным root, выполняет файл, которому присвоены разрешающие или эффективные мандаты. * Ненулевое значение может установить Linux Security Module.

Переменные окружения

Среди наиболее важных переменных окружения следует выделить следующие: LD_ASSUME_KERNEL (в glibc с версии 2.2.3) Каждый общий объект может сообщать динамическому компоновщику о требуемой минимальной версии ядерного ABI (это требование кодируется в разделе ELF note, который можно просмотреть с помощью readelf -n, под меткой NT_GNU_ABI_TAG). Во время выполнения динамический компоновщик определяет версию ABI запущенного ядра и не будет загружать общие объекты, у которых минимальная версия ABI превышает версию ядра.

LD_ASSUME_KERNEL можно использовать, чтобы заставить динамический компоновщик предполагать, что он работает в системе с другой версией ядра ABI. Например, следующая команда заставляет динамический компоновщик при загрузке общих объектов, требуемых myprog, предполагать, что он запущен на Linux с версией 2.2.5:

В системах, предоставляющих несколько версий общего объекта (в различных каталогах пути поиска) с разными требованиями к минимальной версии ядра ABI, LD_ASSUME_KERNEL может использоваться для выбора версии объекта, которую нужно задействовать (в зависимости от порядка поиска в каталогах). Исторически, свойство LD_ASSUME_KERNEL наиболее часто использовалось при ручном выборе старых реализаций нитей POSIX LinuxThreads в системах, которые предоставляли и LinuxThreads, и NPTL (в последствии стала базовой в таких системах); смотрите pthreads(7).

LD_BIND_NOW (libc5; в glibc начиная с версии 2.1.1) Если переменная содержит непустую строку, то динамический компоновщик будет искать все символы при запуске программы вместо того, чтобы отложить поиск вызовов функций до момента, когда они встретятся в первый раз. Это полезно при отладке. LD_LIBRARY_PATH Список каталогов, в которых ищутся библиотеки ELF при выполнении. Элементы списка разделяются двоеточиями или точками с запятой. Похожа на переменную окружения PATH. Данная переменная игнорируется в режиме безопасного выполнения. LD_PRELOAD Список дополнительных, указанных пользователем, общих объектов ELF для загрузки раньше чем все остальные. Элементы списка разделяются пробелами или двоеточиями. Может использоваться для выборочной замены функций из других общих объектов. Объекты ищутся согласно правилам, указанным в ОПИСАНИИ. В режиме безопасного выполнения предварительная загрузка файлов с символами косой черты не выполняется, а общие объекты из стандартных каталогов поиска загружаются только, если на файле общего объекта включён бит режима set-user-ID. LD_TRACE_LOADED_OBJECTS (только для ELF) Если установлена, то вместо нормального запуска программы будут выданы её динамические зависимости, как если бы она была запущена ldd(1).

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

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_AUDIT (в glibc начиная с 2.4) Определяемый пользователем список общих объектов ELF разделяемых двоеточиями, которые будут загружены раньше всех остальных в отдельном пространстве имён компоновщика (т. е., они не внедряются вместо обычных привязываемых символов, которые могли бы быть в этом процессе). Эти объекты можно использовать для контрольной проверки операций динамического компоновщика. LD_AUDIT игнорируется в режиме безопасного выполнения.

Динамический компоновщик будет уведомлять общие объекты контроля в так называемых точках контроля — например, при загрузке нового общего объекта, поиске символа или при вызове символа из другого динамического объекта — вызывая соответствующую функцию из общего объекта контроля. Подробности смотрите в rtld-audit(7). Интерфейс контроля в значительной степени совместим с представленным в Solaris, описан в его Руководстве по компоновщику и библиотекам (Linker and Libraries Guide) в главе Интерфейс контроля компоновщика во время выполнения (Runtime Linker Auditing Interface).

Читайте также: