Linux де лежать бібліотеки
Всі ми звикли користуватися програмами у будь-якій операційній системі для вирішення своїх завдань. Але за функціональністю програм стоїть ще одна річ, з якою ми рідко зустрічаємось при звичайній роботі з комп'ютером. Це бібліотеки, які містять загальний набір функцій та можливостей, які використовуються програмами. Наприклад, більшість програм, написаних на Сі використовують стандартну бібліотеку Сі, в якій містяться всі основні можливості взаємодії з системою.
Кожна програма має свій набір бібліотек, які мають бути в системі, щоб вона змогла працювати. Інакше програмістам довелося б заново винаходити різні алгоритми, писати багато коду і розробка програм займала б у рази більше часу. У цій статті ми зібрали основні бібліотеки 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 – головна бібліотека, вона зібрана у вигляді статичної та не має залежностей. Завантажує інші бібліотеки та виконувані файли. Ви можете викликати цю бібліотеку як програму і передати адресу виконуваного файлу для запуску.
Ці бібліотеки містять набори кодеків для відтворення різноманітних медіа даних. Деякі з них мають невільну ліцензію або закритий вихідний код:
У цій статті ми подивимося, що таке статичні та динамічні бібліотеки. Розташування бібліотек за замовчуванням. Визначення використовуваних бібліотек. Завантаження бібліотек
Бібліотеки це набір функцій, які можна використовувати у різних програмах. Бібліотеки можуть бути статичні (бібліотека прив'язується до певної програми або софт містить цю бібліотеку у своєму тілі) і динамічними (бібліотеки вантажаться в оперативну пам'ять і використовуються). Плюси першого варіанта немає проблеми сумісності, тому що софт вже містить бібліотеку, бібліотека завжди з собою. Але при цьому програми стають більшими за розмірами і тому кожна може завантажувати свої бібліотеки, а іноді й однакові. Другий варіант значно кращий, самі програми за своїм розміром менше. Бібліотека завантажується один раз на оперативку. І наступна програма, якій необхідні такі функції, бере і використовує ці дані.
За промовчанням бібліотеки в 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 включають libc (стандартна бібліотека C) або glibc (версія стандартної бібліотеки C для GNU), libcurl (бібліотека багатопротокольної передачі файлів), libcrypt (бібліотека, яка використовується для шифрування, хешування та кодування в C) та багато інших. .
Linux підтримує два класи бібліотек, а саме:
- Статичні бібліотеки статично прив'язуються до програми під час компіляції.
- Динамічні або бібліотеки, що розділяються - завантажуються при запуску програми і завантажуються в пам'ять, а прив'язка відбувається під час виконання.
Динамічні або бібліотеки, що розділяються, можна розділити на наступні категорії:
- Динамічно підключаються бібліотеки - тут програма пов'язана із загальною бібліотекою, і ядро завантажує бібліотеку (якщо її немає в пам'яті) при виконанні.
- Динамічно завантажені бібліотеки - програма перебирає повний контроль, викликаючи функції з бібліотекою.
Загальні бібліотеки називаються двома способами: ім'я бібліотеки (також відоме як soname) та «ім'я файлу» (абсолютний шлях до файлу, в якому зберігається код бібліотеки).
Наприклад, soname для libc – libc.so.6: де lib – префікс, c – описове ім'я, тобто загальний об'єкт, а 6 – версія. І його ім'я: /lib64/libc.so.6. Зверніть увагу, що soname насправді є символічним посиланням на ім'я файлу.
Загальні бібліотеки завантажуються програмами ld.so (або ld.so.x) та ld-linux.so (або ld-linux.so.x), де x - версія. Linux /lib/ld-linux.so.x виконує пошук і завантажує всі спільні бібліотеки, що використовуються програмою.
Програма може викликати бібліотеку, використовуючи її ім'я або ім'я файлу, а на шляху до бібліотеки зберігаються каталоги, в яких бібліотеки можуть бути знайдені у файловій системі. За замовчуванням бібліотеки розташовані в/usr/local/lib,/usr/local/lib64,/usr/lib та/usr/lib64; бібліотеки запуску системи знаходяться в/lib та/lib64. Однак програмісти можуть встановлювати бібліотеки у довільних місцях.
Шлях до бібліотеки може бути визначений у файлі /etc/ld.so.conf, який можна редагувати за допомогою редактора командного рядка.
Рядки у цьому файлі наказують ядру завантажити файл у /etc/ld.so.conf.d.Таким чином, розробники пакетів або програмісти можуть додавати свої каталоги бібліотек користувача до списку пошуку.
Якщо ви заглянете в каталог /etc/ld.so.conf.d, ви побачите файли .conf для деяких найпоширеніших пакетів (в даному випадку ядра, mysql і postgresql):
Якщо ви подивитеся на mariadb-x86_64.conf, ви побачите абсолютний шлях до бібліотек пакету.
Наведений вище метод встановлює постійний шлях до бібліотеки. Щоб встановити його тимчасово, використовуйте змінне середовище LD_LIBRARY_PATH у командному рядку. Якщо ви хочете зберегти зміни постійними, додайте цей рядок у файл ініціалізації оболонки /etc/profile (global) або
/.profile (для конкретного користувача).
Давайте тепер подивимося, як працювати з бібліотеками, що розділяються. Щоб отримати список всіх залежностей бібліотек, що розділяються, для двійкового файлу, ви можете використовувати утиліту ldd. Висновок ldd має такий вигляд:
Ця команда показує всі залежності бібліотек, що розділяються, для команди ls.
Оскільки бібліотеки, що розділяються, можуть існувати в багатьох різних каталогах, пошук у всіх цих каталогах при запуску програми був би дуже неефективним: що є одним з ймовірних недоліків динамічних бібліотек. Тому використовується механізм кешування, що виконується програмою ldconfig.
За промовчанням ldconfig зчитує вміст /etc/ld.so.conf, створює відповідні символічні посилання в каталогах динамічних посилань, а потім записує кеш в /etc/ld.so.cache, який легко використовується іншими програмами. .
Це дуже важливо, особливо якщо ви тільки що встановили нові бібліотеки, що розділяються, або створили свої власні, або створили нові каталоги бібліотек. Вам потрібно запустити команду ldconfig, щоб зміни набули чинності.
Після створення спільної бібліотеки її потрібно встановити. Ви можете перемістити його до будь-якого зі стандартних каталогів, згаданих вище, і запустити команду ldconfig.
В якості альтернативи виконайте наведену нижче команду, щоб створити символічні посилання від soname до імені файлу:
Щоб розпочати створення власних бібліотек, ознайомтеся з цим посібником у Linux Documentation Project (TLDP).
На цьому поки що все! У цій статті ми познайомили вас із бібліотеками, пояснили спільні бібліотеки та способи керування ними в Linux. Якщо ви маєте будь-які питання або додаткові ідеї, якими ви можете поділитися, використовуйте форму коментарів нижче.
Шлях пошуку для заголовкових файлів та бібліотек Linux
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. При налаштуванні крос-компілятора, які конфігурації шляхів пошуку?
При створенні крос-компілятора необхідно звернути увагу на конфігурацію чотирьох пов'язаних шляхів: шлях файлу бібліотеки, пов'язаний під час компіляції, шлях файлу заголовка, який використовується під час компіляції, шлях двійкового інструменту, який використовується під час компіляції, та ім'я динамічного завантажувача, вказаного під час компіляції шлях.
Якщо не вказано, це має бути шлях за замовчуванням, пов'язаний з установкою. Якщо ви хочете вказати, ви можете використовувати опцію LIB_PATH при компіляції ld в binutils:
- (2) Шлях до заголовкового файлу, який використовується під час компіляції:
- (3) Бінарний шлях інструменту, який використовується під час компіляції:
Шлях двійкового інструмента за промовчанням можна переглянути за допомогою наступної команди:
Використовуючи вказаний двійковий інструмент, можна використовувати опцію "gcc -B":
Шлях та ім'я динамічного завантажувача, жорстко запрограмованого в elf, вказаного у файлі специфікації gcc:
Створіть два .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 за промовчанням.
Скопіюйте 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", щоб вказати шлях пошуку файлу заголовка під час компіляції:
Метод налаштування шляху пошуку файлу заголовка Gcc за промовчанням не уточнено.Але ви можете використовувати наступну команду для перегляду:
Де в linux шукати бібліотеки для GCC?
Допустимо встановив якусь бібліотеку. Де шукати її місцезнаходження, щоб потім вказати компілятору, щоб програма успішно зібралася?
Простий 4 коментаря
chupasaurus, я мав на увазі ось що: я не знаю, куди встановлюються бібліотеки для поточного компілятора. гугл мені не допоміг
sddvxd, Вибачте, але телепати на канікулах. Який дистрибутив, як встановлюєте бібліотеки?
Бібліотеки зазвичай встановлюють у /usr/lib/, /usr/local/lib та їх підпапки. Зазвичай ці шляхи і так знаходяться в LD_PATH, тому достатньо вказати -l
Також бібліотеки часто встановлюються разом з pkg-config конфігурацією, так що можна використовувати його так:
gcc -c file.c `pkg-config --cflags` gcc file.o -o file `pkg-config --libs`
Можна встановити утиліту locate, і шукати все, що вашій душі завгодно. Можна подивитися у пакетному менеджері куди і що встановлюється. Але зазвичай компілятор бачить бібліотеки, встановлені по дефолту (в місця за замовчуванням), вам треба тільки -l і ім'я бібліотеки додати у прапори лінкера.
Розуміння спільних бібліотек у Linux
У програмуванні бібліотека — це набір попередньо скомпільованих фрагментів коду, які можна повторно використовувати у програмі. Бібліотеки спрощують життя програмістам, оскільки вони надають повторно використовувані функції, підпрограми, класи, структури даних тощо (написані іншим програмістом), які можуть використовувати у своїх програмах.
Наприклад, якщо ви створюєте програму, яка має виконувати математичні операції, вам не потрібно створювати для цього нову математичну функцію, ви можете просто використовувати існуючі функції в бібліотеках для цієї мови програмування.
Приклади бібліотек у Linux: libc (стандартна бібліотека C) або Glibc (GNU-версія стандартної бібліотеки C), libcurl (багатопротокольний файл бібліотека передачі), libcrypt (бібліотека, що використовується для шифрування, хешування та кодування в C) та багато інших.
Linux підтримує два класи бібліотек, а саме:
- Статичні бібліотеки статично прив'язуються до програми під час компіляції.
- Динамічні чи загальні бібліотеки – завантажуються під час запуску програми та завантажуються у пам'ять, а прив'язка відбувається під час виконання.
Динамічні або загальні бібліотеки можна розділити на такі категорії:
- бібліотеки, що динамічно підключаються. – тут програма зв'язується із загальною бібліотекою, і ядро завантажує бібліотеку (якщо її немає у пам'яті) під час виконання.
- Динамічно завантажені бібліотеки – програма отримує повний контроль, викликаючи функції за допомогою бібліотеки.
Угоди про імена спільних бібліотек
Загальні бібліотеки називаються двома способами: на ім'я бібліотеки (також відомому як soname) та «імені файлу» (абсолютний шлях до файлу, в якому зберігається код бібліотеки).
Наприклад, soname для libc - це libc.so.6: де lib - Префікс, c - Описове ім'я, тобто означає загальний об'єкт, а 6 - Версія. І ім'я його файлу: /lib64/libc.so.6. Зверніть увагу, що soname насправді є символічним посиланням на ім'я файлу.
Пошук спільних бібліотек у Linux
Загальні бібліотеки завантажуються за допомогою ld.so (або ld.so.x) та ld-linux.so (або ld-linux.so.x), де x - Версія. У Linux /lib/ld-linux.so.x шукає та завантажує всі спільні бібліотеки, що використовуються програмою.
Програма може викликати бібліотеку, використовуючи її ім'я або ім'я файлу, а шлях до бібліотеки зберігає каталоги, в яких можна знайти бібліотеки у файловій системі. За замовчуванням бібліотеки розміщені в каталогах /usr/local/lib, /usr/local/lib64, /usr/lib і . /usr/lib64; системні бібліотеки запуску знаходяться в /lib і /lib64. Однак програмісти можуть встановлювати бібліотеки у довільні місця.
Шлях до бібліотеки можна визначити у файлі /etc/ld.so.conf, який можна редагувати за допомогою редактора командного рядка.
Рядки в цьому файлі наказують ядру завантажити файл у /etc/ld.so.conf.d. Таким чином, супроводжуючі пакети або програмісти можуть додавати свої власні каталоги бібліотек до списку пошуку.
Якщо ви заглянете до каталогу /etc/ld.so.conf.d, ви побачите файли .conf для деяких поширених пакетів (kernel, mysql і postgresql в цю справу):
ls /etc/ld.so.conf.d kernel-2.6.32-358.18.1.el6.x86_64.conf kernel-2.6.32-696.1.1.el6.x86_64.conf mariadb-x86_64.conf kernel-2.6.32-642.6.2.el6.x8 kernel-2.6.32-696.6.3.el6.x86_64.conf postgresql-pgdg-libs.conf
Якщо ви подивитеся mariadb-x86_64.conf, ви побачите абсолютний шлях до бібліотек пакетів.
cat mariadb-x86_64.conf /usr/lib64/mysql
Наведений вище метод назавжди встановлює шлях до бібліотеки. Щоб встановити його тимчасово, використовуйте змінне середовище LD_LIBRARY_PATH у командному рядку. Якщо ви хочете зберегти зміни постійними, додайте цей рядок у файл ініціалізації оболонки /etc/profile (глобальний) або ~/.profile (Для конкретного користувача).
export LD_LIBRARY_PATH=/path/to/library/file
Управління спільними бібліотеками в Linux
Давайте тепер подивимося, як поводитися з бібліотеками, що розділяються. Щоб отримати список усіх залежностей загальної бібліотеки для двійкового файлу, можна використовувати утиліту ldd. Висновок ldd має вигляд:
library name => filename (some hexadecimal value) OR filename (some hexadecimal value) #this is shown when library name can't be read
Ця команда показує всі залежності загальної бібліотеки команди ls.
ldd /usr/bin/ls OR ldd /bin/ls
Приклад виведення
linux-vdso.so.1 => (0x00007ffebf9c2000) libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000) librt.so.1 => /lib64/librt.so.1 (0 so.2 => /lib64/libcap.so.2 (0x0000003b76a00000) libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000) libc.so.6 => /lib64/libc.so. 0x0000003b70600000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000) /lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000) libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70a00000) 1 => /lib64/libattr.so.1 (0x0000003b75600000)
Оскільки спільні бібліотеки можуть існувати в різних каталогах, пошук у всіх цих каталогах при запуску програми буде вкрай неефективним: це один з ймовірних недоліків динамічних бібліотек. Тому використовується механізм кешування, що виконується програмою ldconfig.
За замовчуванням ldconfig зчитує вміст /etc/ld.so.confстворює відповідні символічні посилання в каталогах динамічних посилань, а потім записує кеш в /etc/ld.so.cacheякий потім легко використовується іншими програмами.
Це дуже важливо, особливо якщо ви щойно встановили нові спільні бібліотеки, створили власні або створили нові каталоги бібліотек. Вам потрібно запустити команду ldconfig, щоб зміни набули чинності.
ldconfig OR ldconfig -v #shows files and directories it works with
Після створення спільної бібліотеки необхідно її встановити. Ви можете перемістити його до будь-якого зі стандартних каталогів, згаданих вище, і запустити команду ldconfig.
Альтернативно, виконайте наступну команду, щоб створити символічні посилання з soname на ім'я файлу:
ldconfig -n /path/to/your/shared/libraries
Щоб почати створювати власні бібліотеки, перегляньте цей посібник з Linux Documentation Project (TLDP).
На даний момент це все! У цій статті ми познайомили вас із бібліотеками та пояснили спільні бібліотеки та способи керування ними в Linux.Якщо ви маєте будь-які питання або додаткові ідеї, якими ви можете поділитися, скористайтесь формою коментарів нижче.
Статті з цієї тематики:
- Розуміння команд df і du у Linux
- Розуміння різних оболонок у Linux: Korn Shell
- Розуміння різних оболонок у Linux: Zsh Shell
- Як використовувати AppArmor в Ubuntu
- Розуміння міркувань у моделях великої мови: огляд статті «На шляху до міркування у моделях великої мови: огляд»
- Інтерпретованість та розуміння моделі для PyTorch з використанням Captum
- Розуміння тензорних ядер
- PyTorch 101, Розуміння графіків, автоматичне диференціювання та Autograd
- Розуміння процесора командного рядка в Linux
- Розуміння портів мережного інтерфейсу в Linux
- Розуміння цифрового світу: моя чесна рецензія на книгу
- Розуміння chmod: різниця між u+x та +x
- Розуміння та вирішення проблем із володінням файлами в Linux: «Операція не дозволена»
- «Ласкаво просимо до аварійного режиму!» Помилка завантаження: розуміння та вирішення проблем з fsck
- Розуміння помилки APT «Завантаження виконується з ізольованого програмного середовища від імені користувача root» в Ubuntu
