Jaka jest różnica między plikiem .a a .so?

65

O ile rozumiem, są to biblioteki, ale jaka jest różnica między nimi?

Erik B.
źródło
Temat
RBT

Odpowiedzi:

54

.aPlik jest biblioteka statyczna, podczas gdy .soplik jest udostępniony obiekt (dynamiczny) biblioteka podobna do DLL w systemie Windows. Istnieje kilka szczegółowych informacji na temat różnic między tymi dwoma na tej stronie .

ajk
źródło
18
.amoże być uwzględniony tylko jako część programu podczas kompilacji. .somożna „importować” podczas ładowania programu.
LawrenceC
2
co oznacza .a?
hfrmobile
2
@hfrmobile A oznacza archiwum - biblioteka statyczna to zbiór plików obiektowych utworzonych za pomocą arnarzędzia. Więcej informacji tutaj
ajk
28

W dalszej kolejności plik .a jest archiwum „ar”. Podobnie jak archiwum tar, przechowuje pliki .o lub pliki obiektów, pozwalając między innymi na ich wyciągnięcie z archiwum i połączenie z programem. Możesz użyć ar do przechowywania innych plików, jeśli chcesz.

Możesz uzyskać listę członków pliku ar z parametrem -t, na przykład:

ar -t /usr/lib/libc.a

Plik .so jest plikiem „obiektu współdzielonego” i zawiera o wiele więcej informacji dostępnych dla linkera, dzięki czemu członkowie mogą zostać jak najszybciej połączeni z programem ładującym.

Na przykład spróbuj:

objdump -T /lib/libc-2.11.1.so

(lub dowolną wersję libc.so, którą masz w katalogu / lib). Zauważ, że plik .so może również zawierać skrypt łączący, kierujący go do znalezienia pliku w innym miejscu, lub użyć czegoś innego.

Co ciekawe, plik .so może być także pełnoprawnym programem. Na przykład próba uruchomienia /lib/libc.so.6 . (Niestety, ta ostatnia część nie wydaje się działać na bardziej nowoczesnych systemach. Nie jest to wielka strata.)

Brzeszczot
źródło
Literówka masz na myśli pisać ar -t /usr/lib/libc.a. W rzeczywistości -nie wydaje się to konieczne w tym przypadku. Również /lib/libc.so.6.drukuje tylko niektóre dane wyjściowe. Nie wiem czy nazwałbym to full fledged program.
Faheem Mitha
1
Jest to pełnoprawny program w tym sensie, że ma główny symbol exec do znalezienia.
Hack Saw
2
Możesz także uruchomić ldd.so, a pokaże ci, jakich innych bibliotek używa. Statyczny zwróci komunikat z informacją, że nie jest to biblioteka dynamiczna.
Marcin