В чем разница между библиотеками .so, .la и .a?


230

Я знаю, что .soфайл является динамической библиотекой (многие потоки могут совместно использовать такие библиотеки, поэтому нет необходимости иметь более одной копии в памяти). Но в чем разница между .aи .la? Это все статические библиотеки?

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

Я также хочу знать базовый механизм загрузки библиотек (обоих видов) и как вызывается фрагмент кода в библиотеке, когда он где-то используется. Какую часть ядра я должен изучать? И какую связанную команду / утилиту 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

Ответы:


306

.soфайлы являются динамическими библиотеками . Суффикс означает «общий объект», поскольку все приложения, связанные с библиотекой, используют один и тот же файл, а не делают копию в результирующем исполняемом файле.

.aфайлы являются статическими библиотеками . Суффикс расшифровывается как «архив», потому что на самом деле это просто архив (созданный с помощью arкоманды - предшественник, tarкоторый теперь используется только для создания библиотек) исходных объектных файлов .o.

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

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

Static pro: пользователь всегда использует версию библиотеки, которую вы протестировали с вашим приложением, поэтому не должно быть никаких проблем с совместимостью.

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

Dynamic pro: объем памяти вашего процесса меньше, поскольку память, используемая для библиотеки, амортизируется среди всех процессов, использующих библиотеку.

Dynamic Pro: библиотеки могут быть загружены по требованию во время выполнения; это хорошо для плагинов, поэтому вам не нужно выбирать плагины, которые будут использоваться при компиляции и установке программного обеспечения. Новые плагины могут быть добавлены на лету.

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

Динамические библиотеки особенно полезны для системных библиотек, например libc. Эти библиотеки часто должны включать код, который зависит от конкретной ОС и версии, поскольку интерфейсы ядра изменились. Если вы свяжете программу со статической системной библиотекой, она будет работать только в той версии ОС, для которой эта версия библиотеки была написана. Но если вы используете динамическую библиотеку, она автоматически подберет библиотеку, установленную в системе, на которой вы работаете.


1
@ Barmar, То есть вы говорите, что преимущества статических библиотек перевешивают преимущества динамических библиотек?
Pacerier

4
@Pacerier Я не знаю, откуда ты это взял.
Бармар

13
Это бессмысленный вопрос. Вес плюсов и минусов зависит от обстоятельств, универсального ответа нет. Кажется, у вас есть план, и вы пытаетесь меня приманить.
Бармар

3
@ Бармар, нет, я невиновен. Просто любопытный.
Pacerier

11
Другим фактором является лицензирование - LGPL требует динамических ссылок в коммерческом контексте, то есть там, где вы не хотите распространять свой источник.
Сэм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.