Яка різниця між файлами бібліотек .so, .la та .a?


230

Я знаю, що .soфайл є своєрідною динамічною бібліотекою (безліч потоків можуть обмінюватися такими бібліотеками, тому не потрібно мати більше однієї копії його в пам'яті). Але в чому різниця між .aі .la? Це все статичні бібліотеки?

Якщо динамічні ліфти мають великі переваги перед статичними, чому все ще існує багато статичних бібліотек?

Я також хочу знати основний механізм завантаження бібліотек (обох видів) і те, як викликається фрагмент коду в lib, коли він десь використовується. Яку частину ядра я повинен вивчити? І які пов'язані команди / утиліти Linux я повинен знати, щоб знати, як працює процес? (Я ldдосі знаю команду)

Коли я повинен спробувати вбудувати код у .soабо .a? Який з них кращий?

[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep  2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror   931 Sep  2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep  2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep  2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror   932 Sep  2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep  2 23:25 openvpn-plugin-down-root.so

Дивіться також autotools.io/libtool/lafiles.html
Pacerier

Відповіді:


306

.soфайли - це динамічні бібліотеки . Суфікс означає «спільний об’єкт», оскільки всі програми, пов’язані з бібліотекою, використовують один і той же файл, а не роблять копію в отриманий виконуваний файл.

.aФайли - це статичні бібліотеки . Суфікс означає "архів", тому що вони насправді є лише архівом (зробленим за допомогою arкоманди - попередника, tarщо зараз використовується лише для створення бібліотек) оригінальних файлів .o.

.laФайли - це текстові файли, використовувані пакетом "libtools" GNU для опису файлів, що складають відповідну бібліотеку. Ви можете знайти більше інформації про них у цьому запитанні: Для чого потрібен файл .la?

Статичні та динамічні бібліотеки мають свої плюси і мінуси.

Статичний професіонал: Користувач завжди використовує версію бібліотеки, яку ви протестували разом із додатком, тому не повинно виникнути жодних дивних проблем із сумісністю.

Статичний результат: Якщо проблема вирішена в бібліотеці, вам потрібно перерозподілити свою програму, щоб скористатися нею. Однак, якщо це не бібліотека, яку користувачі, ймовірно, оновлюють самостійно, вам, можливо, доведеться це зробити все одно.

Динамічна професія: слід пам'яті вашого процесу менший, оскільки пам'ять, що використовується для бібліотеки, амортизується серед усіх процесів, що використовують бібліотеку.

Динамічні профі: бібліотеки можна завантажувати на вимогу під час виконання; це добре для плагінів, тому не потрібно вибирати плагіни, які використовуватимуться під час компіляції та встановлення програмного забезпечення. Нові плагіни можна додавати на ходу.

Динамічний кон: Бібліотека може не існувати в системі, де хтось намагається встановити додаток, або у них може бути версія, несумісна з програмою. Щоб пом'якшити це, пакет додатків може містити копію бібліотеки, щоб він міг встановити її за потреби. Це також часто пом'якшується менеджерами пакетів, які можуть завантажувати та встановлювати будь-які необхідні залежності.

Динамічні бібліотеки особливо корисні для системних бібліотек, наприклад libc. Цим бібліотекам часто потрібно включати код, який залежить від конкретної ОС та версії, оскільки інтерфейси ядра змінилися. Якщо ви зв’яжете програму зі статичною системною бібліотекою, вона запускається лише у версії ОС, для якої була написана ця версія бібліотеки. Але якщо ви використовуєте динамічну бібліотеку, вона автоматично підбирає бібліотеку, встановлену в системі, в якій ви працюєте.


1
@Barmar, Отже, ви говорите, що переваги статичних бібліотек переважають переваги динамічних бібліотек?
Pacerier

4
@Pacerier Я не знаю, звідки ти це взяв.
Бармар

13
Це безглузде питання. Вага плюсів і мінусів залежить від обставин, універсальної відповіді немає. Здається, у вас є порядок денний, і ви намагаєтесь мене принадити.
Бармар

3
@Barmar, Nop Я невинний. Просто допитливий ер.
Pacerier

11
Ще один фактор - ліцензування - LGPL вимагає динамічного зв’язку в комерційному контексті, тобто там, де ви не хочете поширювати своє джерело.
Сам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.