Apa perbedaan antara file perpustakaan .so, .la dan .a?

230

Saya tahu .sofile adalah semacam perpustakaan dinamis (banyak utas dapat berbagi perpustakaan seperti itu sehingga tidak perlu memiliki lebih dari satu salinan di memori). Tetapi apa perbedaan antara .adan .la? Apakah ini semua perpustakaan statis?

Jika lib dinamis memiliki keunggulan besar dibandingkan yang statis, mengapa masih ada banyak perpustakaan statis?

Saya juga ingin tahu mekanisme yang mendasari untuk memuat pustaka (kedua jenis) dan bagaimana sepotong kode dalam lib dipanggil ketika digunakan di suatu tempat. Bagian mana dari kernel yang harus saya pelajari? Dan perintah / utilitas Linux apa yang harus saya ketahui untuk mengetahui bagaimana suatu proses berjalan? (Saya hanya tahu ldperintah sekarang)

Kapan saya harus mencoba membuat kode menjadi .soatau .a? Mana yang lebih baik?

[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
hugemeow
sumber
Lihat juga autotools.io/libtool/lafiles.html
Pacerier

Jawaban:

306

.sofile adalah pustaka dinamis . Suffix adalah singkatan dari "shared object", karena semua aplikasi yang ditautkan dengan pustaka menggunakan file yang sama, daripada membuat salinan dalam hasil yang dapat dieksekusi.

.afile adalah pustaka statis . Akhiran singkatan dari "arsip", karena mereka sebenarnya hanya arsip (dibuat dengan arperintah - pendahulu taryang sekarang hanya digunakan untuk membuat perpustakaan) dari file objek .o asli.

.lafile adalah file teks yang digunakan oleh paket "libtools" GNU untuk menggambarkan file yang membentuk pustaka yang sesuai. Anda dapat menemukan informasi lebih lanjut tentang mereka dalam pertanyaan ini: Untuk apa file .la libtool?

Perpustakaan statis dan dinamis masing-masing memiliki pro dan kontra.

Pro statis: Pengguna selalu menggunakan versi perpustakaan yang telah Anda uji dengan aplikasi Anda, jadi seharusnya tidak ada masalah kompatibilitas yang mengejutkan.

Static con: Jika masalah diperbaiki di perpustakaan, Anda perlu mendistribusikan kembali aplikasi Anda untuk memanfaatkannya. Namun, kecuali itu adalah perpustakaan yang cenderung diperbarui oleh pengguna sendiri, Anda mungkin harus tetap melakukannya.

Dynamic pro: Jejak memori proses Anda lebih kecil, karena memori yang digunakan untuk perpustakaan diamortisasi di antara semua proses menggunakan perpustakaan.

Dynamic pro: Library dapat dimuat sesuai permintaan saat run time; ini bagus untuk plugin, jadi Anda tidak harus memilih plugin yang akan digunakan saat kompilasi dan menginstal perangkat lunak. Plugin baru dapat ditambahkan dengan cepat.

Kon dinamis: Perpustakaan mungkin tidak ada pada sistem di mana seseorang mencoba untuk menginstal aplikasi, atau mereka mungkin memiliki versi yang tidak kompatibel dengan aplikasi. Untuk mengurangi ini, paket aplikasi mungkin perlu menyertakan salinan perpustakaan, sehingga dapat menginstalnya jika perlu. Ini juga sering dikurangi oleh manajer paket, yang dapat mengunduh dan menginstal segala dependensi yang diperlukan.

Pustaka dinamis sangat berguna untuk pustaka sistem, seperti libc. Pustaka ini sering perlu menyertakan kode yang bergantung pada OS dan versi spesifik, karena antarmuka kernel telah berubah. Jika Anda menautkan program dengan pustaka sistem statis, itu hanya akan berjalan pada versi OS yang dibuat untuk versi pustaka ini. Tetapi jika Anda menggunakan perpustakaan dinamis, itu akan secara otomatis mengambil perpustakaan yang diinstal pada sistem yang Anda jalankan.

Barmar
sumber
1
@Barmar, Jadi Anda mengatakan bahwa keuntungan perpustakaan statis lebih penting daripada perpustakaan dinamis?
Pacerier
4
@Pacerier Saya tidak tahu dari mana Anda mendapatkannya.
Barmar
13
Itu pertanyaan tak berarti. Berat pro dan kontra tergantung pada keadaan, tidak ada jawaban universal. Sepertinya Anda memiliki agenda, dan Anda mencoba memancing saya.
Barmar
3
@Barmar, Nop aku tidak bersalah. Hanya penasaran-er.
Pacerier
11
Faktor lain adalah perizinan - LGPL memerlukan penautan dinamis dalam konteks komersial, yaitu di mana Anda tidak ingin mendistribusikan sumber Anda.
Sam