- Как вы указываете расположение библиотек в бинарный файл? (Linux)
- ИТ База знаний
- Полезно
- Навигация
- Серверные решения
- Телефония
- Корпоративные сети
- Управление библиотеками в Linux
- Русские Блоги
- Путь поиска для заголовочных файлов и библиотек Linux
- 1.1 В какую папку устанавливаются библиотечные файлы .so и заголовочные файлы .h при установке glibc, как gcc может правильно найти соответствующие папки?
- 1.2 Каковы пути поиска библиотеки ссылок, когда программа связана?
- 1.3 Когда программа работает, каковы пути поиска в библиотеке динамических ссылок?
- 1.4. Каковы пути поиска заголовочных файлов при компиляции программы?
- 1.5. При настройке кросс-компилятора, каковы конфигурации пути поиска?
- 2. Пример операции
- 2.1, путь поиска библиотеки при связывании
- 2.2, место поиска библиотеки динамической загрузки во время выполнения
- 2.3 Каковы пути поиска заголовочных файлов при компиляции программы?
Как вы указываете расположение библиотек в бинарный файл? (Linux)
Для этого вопроса я буду использовать конкретный пример, но на самом деле это обобщает практически любой бинарный файл в linux, который не может найти свои зависимые библиотеки. Итак, у меня есть программа, которая не запускается из-за отсутствия библиотек:
ldd проливает свет на проблему:
Однако корона установлена:
Как мне указать двоичному файлу, где искать «недостающую» библиотеку?
Для разового выбора установите для переменной LD_LIBRARY_PATH список каталогов, разделенных двоеточиями, для поиска. Это аналогично PATH для исполняемых файлов, за исключением того, что стандартные системные каталоги дополнительно ищутся после тех, которые указаны в среде.
Если у вас есть программа, которая хранит библиотеки в нестандартном месте и не может найти их самостоятельно, вы можете написать скрипт-обертку:
Список стандартных системных каталогов хранится в /etc/ld.so.conf . Последние системы позволяют этому файлу включать другие файлы; если у вас есть что-то вроде этого include /etc/ld.so.conf.d/*.conf , создайте новый файл, /etc/ld.so.conf.d/mala.conf содержащий каталоги, которые вы хотите добавить. После того, как вы изменили /etc/ld.so.conf или включили файл, запустите, /sbin/ldconfig чтобы ваши изменения вступили в силу (это обновит кеш).
( LD_LIBRARY_PATH также применимо ко многим другим приложениям, включая FreeBSD, NetBSD, OpenBSD, Solaris и Tru64. HP-UX имеет SHLIB_PATH и Mac OS X имеет DYLD_LIBRARY_PATH . /etc/ld.so.conf У большинства аналогов есть аналоги, но расположение и синтаксис отличаются более широко.)
Если вы хотите избежать LD_LIBRARY_PATH, вы также можете сделать это во время ссылки:
-Wl, . используется для передачи дополнительных команд компоновщику, и в этом случае с -R вы указываете компоновщику сохранить этот путь как «путь поиска по умолчанию» для .so.
Я держу заметки о многих маленьких советах, подобных этому, на моем сайте:
Это указывает, что libcorona не установлен по правильному пути. Переместите каталог libcorona по правильному пути, проблема будет решена.
Источник
ИТ База знаний
Курс по Asterisk
Полезно
— Узнать IP — адрес компьютера в интернете
— Онлайн генератор устойчивых паролей
— Онлайн калькулятор подсетей
— Калькулятор инсталляции IP — АТС Asterisk
— Руководство администратора FreePBX на русском языке
— Руководство администратора Cisco UCM/CME на русском языке
— Руководство администратора по Linux/Unix
Навигация
Серверные решения
Телефония
FreePBX и Asterisk
Настройка программных телефонов
Корпоративные сети
Протоколы и стандарты
Управление библиотеками в Linux
Когда библиотекарь — пингвин
4 минуты чтения
В данной статье мы посмотрим, что такое статические и динамические библиотеки. Местоположение библиотек по умолчанию. Определение используемых библиотек. Загрузка библиотек.
Мини — курс по виртуализации
Знакомство с VMware vSphere 7 и технологией виртуализации в авторском мини — курсе от Михаила Якобсена
Библиотеки это набор функций, которые могут использоваться в различных программах. Библиотеки могут быть статические (библиотека привязывается к определенной программе или софт содержит данную библиотеку в своем теле.) и динамическими (библиотеки грузятся в оперативную память и используются). Плюсы первого варианта нет проблемы совместимости, т. к. софт уже в себе содержит библиотеку, библиотека всегда с собой. Но при этом программы становятся большие по размеры и т.к каждая может загружать свои библиотеки, а иногда и одинаковые. Второй вариант значительно лучше, сами программы по своему размеру меньше. Библиотека загружается один раз в оперативку. И следующая программа, которой необходимы такие же функции, берет и использует эти данные.
По умолчанию библиотеки в Linux находятся в двух папках. Это корневая папка /lib в ней находятся библиотеки, которые используют программы, расположенные в корневой папке /bin.
И есть вторая папка /usr/lib. В ней находятся библиотеки, которые используют программы расположенные /usr/bin. Пути к библиотекам указаны файле /etc/ld.so.conf. Данный файл можно просмотреть стандартным способом, через утилиту cat.
Видим, что написано включить все библиотеки, которые расположены по пути, указанном в файле. Те которые оканчиваются на .conf. Он просто включает в себя все настройки, которые находятся в конфигурационных файлах, в данной директории. Переходим в данную директорию.
В данной директории мы можем видеть 2 файла конфигурации, в зависимости от версии и наполнения операционной системы их может быть и больше. Ну и соответственно в конфигурационных файлах находятся пути к директориям, где лежат необходимые для работы библиотеки. Если мы ставим какое, то свое программное обеспечение, которому необходимы дополнительные библиотеки, не идущие в составе дистрибутива linux, то в данной директории может создаться свой конфигурационный файл. Например: если мы используем систему виртуализации VMware, то к каждой VM устанавливаем VMware tools то данное программное обеспечение создаст свой конфигурационный файл с путями для своих библиотек.
Переходим в директорию cd /etc/ и отсортируем так, чтобы в результатах все, что содержит ld.
Видим 3 основных конфигурационных файла. ld.so.conf — это файл конфигурации в котором написано откуда брать дополнительные библиотеки. Директория ls.so.conf.d в которой находятся дополнительные конфигурационные файлы и ld.so.cache это кэш библиотек. Он у нас выстраивается каждый раз для того, чтобы программы при необходимости при запросе библиотек не копались в файлах, а сразу брали из загруженного в оперативную память кэша. Т.е. если мы вносим какие-то изменения в файл конфигурации, добавляем какие-то конфигурационные файлы нам необходимо обновить этот кэш. Кэш обновляется командой ldconfig. Этого, собственно, достаточно, чтобы прогрузить все библиотеки в кэш.
Давайте посмотрим, как, определить какими библиотеками пользуется какая программа.
Для этого мы будем использовать команду ldd и путь к бинарному файлу. Например: Программа ls которая используется для вывода списка файлов в каталоге. Она находится в каталоге /bin/ls.
В результате получим мы следующее:
Мы видим, какие so использует данная программа и соответственно ссылки на них, где они расположены, собственно, so — это наши библиотеки в данном случае.
Возможно добавление библиотек вручную, это может потребоваться если мы ставим совершенно стороннее программное обеспечение, которое очень трудно взаимодействует с Linux или устаревшее. Т.е. которое само не может создать конфигурационный файл и разнести библиотеки в системные директории Linux. Если мы хотим сделать это вручную, тогда нам необходим тот самый файл /etc/ld.so.conf. В данный файл мы можем дописать путь к файлу конфигурации библиотек тех, которые нам нужны. Либо есть более легкий вариант с использованием переменной export LD_LIBRARY_PATH и указать путь к тем особенным библиотекам, которые будет использовать наша «особенная» программа. Обычно все стороннее программное обеспечение устанавливается в папку /opt. Итоговый вариант будет выглядеть как: export LD_LIBRARY_PATH=/opt/soft/lib и когда пройдет экспорт, у нас попробует погрузится из этого пути библиотека, но перед этим необходимо не забыть сделать ldconfig.
Онлайн курс по Linux
Мы собрали концентрат самых востребованных знаний, которые позволят тебе начать карьеру администратора Linux, расширить текущие знания и сделать уверенный шаг к DevOps
Источник
Русские Блоги
Путь поиска для заголовочных файлов и библиотек Linux
Эта статья перенесена с: https://blog.csdn.net/pwl999/article/details/78219374
1.1 В какую папку устанавливаются библиотечные файлы .so и заголовочные файлы .h при установке glibc, как gcc может правильно найти соответствующие папки?
Когда мы устанавливаем –prefix = / path / при сборке gcc, gcc устанавливается в / path /. По умолчанию gcc будет искать библиотеки в / path / lib / и искать файлы заголовков в / path / include /.
Например, в обычных системах Linux и gcc, и glibc установлены в каталоге / usr /, поэтому исполняемый файл gcc находится в каталоге / usr / bin, а файл библиотеки glibc находится в / usr / lib В этом каталоге файл заголовка glibc находится в каталоге / usr / include.
Разумеется, указанное выше соотношение не является точным и может быть указано вручную при установке gcc и glibc. Вы можете использовать команду «gcc -print-search-dirs» для просмотра пути поиска библиотеки gcc:
Вы можете использовать следующие методы, чтобы изменить путь к библиотеке и файлу заголовка, который gcc ищет по умолчанию:
- (1) Используйте «gcc -nostdlib -Lusrlibpath», чтобы изменить путь поиска библиотеки по умолчанию для gcc, и используйте «gcc -nostdinc -Iusrincpath», чтобы изменить путь поиска заголовка по умолчанию для gcc.
- (2) Используйте «gcc -Wl, -sysroot =», чтобы изменить путь поиска библиотеки по умолчанию для gcc.
- (3) Измените файл спецификации gcc, чтобы настроить любые параметры gcc.
Спецификации — это файлы конфигурации gcc. Этот метод модификации является самым мощным, но он также является самым сложным и рискованным, поскольку файл спецификации gcc неясен и труден для понимания. Пока я не буду изменять его, но сначала я расскажу о существовании этого метода.
Используйте команду «gcc -v», чтобы просмотреть путь к спецификациям gcc:
В некоторых установках gcc используются встроенные спецификации, но нет внешних файлов спецификаций:
Для встроенной спецификации вы можете использовать команду «gcc -dumpspecs» для просмотра содержимого конкретной спецификации:
Вы также можете использовать «gcc -specs =», чтобы указать файл спецификации gcc.
- (4) Передается ли конфигурация gcc по умолчанию командой configure во время сборки?
Используйте команду «gcc -v» для просмотра значения конфигурации gcc. Параметры конфигурации описаны в файле gcc-4.1.0 \ gcc \ doc \ install.texi.
1.2 Каковы пути поиска библиотеки ссылок, когда программа связана?
При связывании конфигурация пути поиска библиотеки имеет следующие методы: (Для конкретного использования, пожалуйста, обратитесь к описанию в главе примера)
- (1) Используйте «gcc -Llibpath -llibname», чтобы указать путь поиска библиотеки ссылок.
- (2) Используйте переменную среды «LIBRARY_PATH», чтобы указать путь поиска библиотеки ссылок.
- (3) Используйте «SEARCH_DIR» в сценарии подключения ld, чтобы указать путь поиска библиотеки ссылок.
1.3 Когда программа работает, каковы пути поиска в библиотеке динамических ссылок?
При связывании конфигурация пути поиска библиотеки имеет следующие методы: (Для конкретного использования, пожалуйста, обратитесь к описанию в главе примера)
- (1) При компиляции используйте «gcc -Wl, -rpath», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения, и жестко запишите его в опцию «RPATH» файла ELF.
- (2) Переменная среды «LD_RUN_PATH» используется для указания пути поиска библиотеки динамических ссылок во время компиляции, и она жестко задана в опции «RPATH» файла ELF.
- (3) Используйте переменную среды «LD_LIBRARY_PATH», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения.
- (4) Используйте файл конфигурации «/etc/ld.so.conf», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения.
- (5) Используйте путь поиска по умолчанию «/ lib, / usr / lib» библиотеки динамических ссылок во время выполнения.
1.4. Каковы пути поиска заголовочных файлов при компиляции программы?
При компиляции конфигурация пути поиска файла заголовка имеет следующие методы: (Для конкретного использования, пожалуйста, обратитесь к описанию в главе примера)
- (1) Используйте «gcc -I incpath», чтобы указать путь поиска файла заголовка во время компиляции.
- (2) Используйте переменную окружения «C_INCLUDE_PATH», чтобы указать путь поиска файла заголовка во время компиляции.
- (3) Использовать путь поиска заголовка gcc по умолчанию при компиляции.
Описание общих каталогов заголовочных файлов:
/ usr / src / linux / — это путь к исходному коду ядра, а / usr / src / linux / include содержит заголовочный файл ядра, который обычно используется при компиляции модуля.
Путь / usr / include — это в основном заголовочный файл glibc, который используется для компиляции файлов пользовательского режима. Однако / usr / include также содержит папки linux / и asm /, необходимые для заголовочных файлов ядра, но эти две папки в основном используются для совместимости, а / usr все еще используется для заголовочных файлов ядра. / SRC / Linux / включить.
1.5. При настройке кросс-компилятора, каковы конфигурации пути поиска?
При создании кросс-компилятора необходимо обратить внимание на конфигурацию четырех связанных путей: путь файла библиотеки, связанный во время компиляции, путь файла заголовка, используемого во время компиляции, путь двоичного инструмента, используемого во время компиляции, и имя динамического загрузчика, указанного во время компиляции путь.
- (1) Путь к файлу библиотеки, связанному во время компиляции:
Если не указан, это должен быть путь по умолчанию, связанный с путем установки. Если вы хотите указать, вы можете использовать опцию «LIB_PATH» при компиляции ld в binutils:
- (2) Путь к заголовочному файлу, используемому во время компиляции:
- (3) Бинарный путь инструмента, используемый во время компиляции:
Путь двоичного инструмента по умолчанию можно просмотреть с помощью следующей команды:
Используя указанный двоичный инструмент, вы можете использовать опцию «gcc -B»:
- (4) Путь и имя динамического загрузчика, указанного во время компиляции:
Путь и имя динамического загрузчика, жестко запрограммированного в elf, указанного в файле спецификации gcc:
2. Пример операции
Создайте два .c файла:
2.1, путь поиска библиотеки при связывании
Скомпилируйте say.c в libsay.so, а затем скомпилируйте libsay.so при компиляции test.c, чтобы проверить путь поиска в библиотеке, когда gcc связан.
- (1) Используйте «gcc -Llibpath -llibname», чтобы указать путь поиска библиотеки ссылок:
(2) Используйте переменную среды «LIBRARY_PATH», чтобы указать путь поиска библиотеки ссылок:
(3) Используйте «SEARCH_DIR» в сценарии подключения ld, чтобы указать путь поиска библиотеки ссылок:
Используйте команду «ld -verbose», чтобы просмотреть параметр SEARCH_DIR в скрипте ссылок gcc по умолчанию. Конечно, вы также можете использовать «ld -Txxx.lds», чтобы указать скрипт связи.
Скопируйте libsay.so в указанный путь SEARCH_DIR и свяжите тест:
2.2, место поиска библиотеки динамической загрузки во время выполнения
- (1) Используйте «gcc -Wl, -rpath», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения, и жестко закодируйте в ELF-файл параметр «RPATH»:
Используйте файл readelf для просмотра жестко заданного пути поиска библиотеки времени выполнения в файле elf:
- (2) Используйте переменную среды «LD_RUN_PATH», чтобы указать путь поиска библиотеки динамических ссылок во время компиляции, и жестко запишите ее в опцию «RPATH» файла ELF:
- (3) Используйте переменную среды «LD_LIBRARY_PATH», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения:
(4) Используйте файл конфигурации «/etc/ld.so.conf», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения:
(5) Используйте путь поиска по умолчанию «/ lib, / usr / lib» библиотеки динамических ссылок во время выполнения:
Создайте файл .c и файл .h:
2.3 Каковы пути поиска заголовочных файлов при компиляции программы?
(1) Используйте «gcc -I incpath», чтобы указать путь поиска файла заголовка во время компиляции:
(2) Используйте переменную окружения «C_INCLUDE_PATH», чтобы указать путь поиска файла заголовка во время компиляции:
- (3) Использовать путь поиска заголовка gcc по умолчанию при компиляции:
Метод настройки пути поиска файла заголовка Gcc по умолчанию не уточнен. Но вы можете использовать следующую команду для просмотра:
Используйте путь по умолчанию для компиляции:
Источник