Я знаю, что .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
Ответы:
.so
файлы являются динамическими библиотеками . Суффикс означает «общий объект», поскольку все приложения, связанные с библиотекой, используют один и тот же файл, а не делают копию в результирующем исполняемом файле..a
файлы являются статическими библиотеками . Суффикс расшифровывается как «архив», потому что на самом деле это просто архив (созданный с помощьюar
команды - предшественник,tar
который теперь используется только для создания библиотек) исходных объектных файлов .o..la
файлы - это текстовые файлы, используемые пакетом GNU «libtools» для описания файлов, составляющих соответствующую библиотеку. Вы можете найти больше информации о них в этом вопросе: Для чего нужен файл .la libtool?Статические и динамические библиотеки имеют свои плюсы и минусы.
Static pro: пользователь всегда использует версию библиотеки, которую вы протестировали с вашим приложением, поэтому не должно быть никаких проблем с совместимостью.
Статический довод: если проблема устранена в библиотеке, вам нужно распространить свое приложение, чтобы воспользоваться этим преимуществом. Однако, если это не библиотека, которую пользователи, скорее всего, будут обновлять самостоятельно, вам, возможно, придется сделать это в любом случае.
Dynamic pro: объем памяти вашего процесса меньше, поскольку память, используемая для библиотеки, амортизируется среди всех процессов, использующих библиотеку.
Dynamic Pro: библиотеки могут быть загружены по требованию во время выполнения; это хорошо для плагинов, поэтому вам не нужно выбирать плагины, которые будут использоваться при компиляции и установке программного обеспечения. Новые плагины могут быть добавлены на лету.
Динамический довод: библиотека может отсутствовать в системе, в которой кто-то пытается установить приложение, или может иметь версию, несовместимую с приложением. Чтобы смягчить это, пакет приложения, возможно, должен включать копию библиотеки, поэтому он может установить ее при необходимости. Это также часто смягчается менеджерами пакетов, которые могут загружать и устанавливать любые необходимые зависимости.
Динамические библиотеки особенно полезны для системных библиотек, например
libc
. Эти библиотеки часто должны включать код, который зависит от конкретной ОС и версии, поскольку интерфейсы ядра изменились. Если вы свяжете программу со статической системной библиотекой, она будет работать только в той версии ОС, для которой эта версия библиотеки была написана. Но если вы используете динамическую библиотеку, она автоматически подберет библиотеку, установленную в системе, на которой вы работаете.источник