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

Ответы:

54

.aФайл является статической библиотекой, а .soфайл является общим объект (динамическая) библиотека похожа на DLL на Windows. На этой странице есть подробная информация о различиях между ними .

AJK
источник
18
.aможет быть включен только как часть программы во время компиляции. .soможно импортировать во время загрузки программы.
LawrenceC
2
что означает .a?
hfrmobile
2
@hfrmobile A обозначает архив - статическая библиотека представляет собой набор объектных файлов, созданных с помощью arутилиты. Больше информации здесь
ajk
28

Как следствие, файл .a является архивом "ar". В отличие от архива tar, он хранит .o или объектные файлы, что позволяет извлекать их из архива и связывать в программе, среди прочего. Вы можете использовать ar для хранения других файлов, если хотите.

Вы можете получить список членов ar-файла с параметром -t, например:

ar -t /usr/lib/libc.a

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

Например, попробуйте:

objdump -T /lib/libc-2.11.1.so

(или какую-либо версию libc.so, которая находится в вашем каталоге / lib.) Обратите внимание, что файл .so также может просто содержать скрипт компоновщика, указывающий ему найти файл в другом месте, или использовать что-то еще.

Интересно, что файл .so также может быть полноценной программой. Например, попробуйте запустить /lib/libc.so.6 . (К сожалению, эта последняя часть, похоже, не работает на более современных системах. Не то, чтобы это была большая потеря.)

Hack Saw
источник
Опечатка. ты хочешь написать ar -t /usr/lib/libc.a. На самом деле -в этом случае нет необходимости. Также /lib/libc.so.6.просто печатает некоторые выходные данные. Я не знаю, назову ли я это full fledged program.
Фахим Митха
1
Это полноценная программа в том смысле, что в ней есть главный символ для поиска exec.
Hack Saw
2
Вы также можете запустить ldd.so, и он покажет вам, какие другие библиотеки он использует. Static вернется с сообщением о том, что это не динамическая библиотека.
Марцин