В чем разница между файлами .so,.la и .a?

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

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

Я также хочу знать базовый механизм загрузки библиотек (оба вида) и того, как кусок кода в lib вызывается, когда он используется где-то. Какую часть ядра я должен изучать? И какую связанную команду/утилиту Linux я должен знать, чтобы знать, как работает процесс? (Я знаю только команду ld)

Когда я должен попытаться создать код в .so или .a? Какой из них лучше?

[[email protected] 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

Ответ 1

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

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

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

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

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

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

Динамический pro: объем памяти процесса меньше, потому что память, используемая для библиотеки, амортизируется среди всех процессов с использованием библиотеки.

Динамический профиль: библиотеки могут загружаться по требованию во время выполнения; это полезно для плагинов, поэтому вам не нужно выбирать плагины, которые будут использоваться при компиляции и установке программного обеспечения. Новые плагины могут быть добавлены "на лету".

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