Saya tahu .so
file 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 .a
dan .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 ld
perintah sekarang)
Kapan saya harus mencoba membuat kode menjadi .so
atau .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
Jawaban:
.so
file 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..a
file adalah pustaka statis . Akhiran singkatan dari "arsip", karena mereka sebenarnya hanya arsip (dibuat denganar
perintah - pendahulutar
yang sekarang hanya digunakan untuk membuat perpustakaan) dari file objek .o asli..la
file 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.sumber