GNU/Linux >> Belajar Linux >  >> Linux

Perbedaan antara objek bersama (.so), pustaka statis (.a), dan DLL (.so)?

Sebuah perpustakaan statis(.a) adalah pustaka yang dapat ditautkan langsung ke file executable akhir yang dihasilkan oleh linker, yang terkandung di dalamnya dan tidak perlu memiliki library ke dalam sistem tempat file executable akan diterapkan.

Sebuah pustaka bersama(.so) adalah pustaka yang ditautkan tetapi tidak disematkan dalam executable akhir, sehingga akan dimuat saat executable diluncurkan dan harus ada di sistem tempat executable diterapkan.

Sebuah pustaka tautan dinamis di windows(.dll) seperti perpustakaan bersama (.so) di linux tetapi ada beberapa perbedaan antara dua implementasi yang terkait dengan OS (Windows vs Linux):

Sebuah DLL dapat mendefinisikan dua jenis fungsi:diekspor dan internal. Fungsi yang diekspor dimaksudkan untuk dipanggil oleh modul lain, serta dari dalam DLL tempat mereka ditentukan. Fungsi internal biasanya dimaksudkan untuk dipanggil hanya dari dalam DLL tempat mereka ditentukan.

Sebuah JADI library di Linux tidak memerlukan pernyataan ekspor khusus untuk menunjukkan simbol yang dapat diekspor, karena semua simbol tersedia untuk proses interogasi.


Saya selalu berpikir bahwa DLL dan objek yang dibagikan hanyalah istilah yang berbeda untuk hal yang sama - Windows menyebutnya DLL, sedangkan pada sistem UNIX mereka adalah objek yang dibagikan, dengan istilah umum - perpustakaan yang terhubung secara dinamis - mencakup keduanya (bahkan fungsi untuk buka .so pada UNIX disebut dlopen() setelah 'perpustakaan dinamis').

Mereka memang hanya ditautkan saat startup aplikasi, namun anggapan Anda tentang verifikasi terhadap file header salah. File header mendefinisikan prototipe yang diperlukan untuk mengkompilasi kode yang menggunakan pustaka, tetapi pada waktu penautan, penaut melihat ke dalam pustaka itu sendiri untuk memastikan fungsi yang diperlukan benar-benar ada. Penaut harus menemukan badan fungsi di suatu tempat pada waktu penautan atau itu akan menimbulkan kesalahan. Itu JUGA melakukan itu pada saat runtime, karena seperti yang Anda tunjukkan dengan benar, perpustakaan itu sendiri mungkin telah berubah sejak program dikompilasi. Inilah mengapa stabilitas ABI sangat penting dalam pustaka platform, karena perubahan ABI adalah yang merusak program yang ada saat dikompilasi dengan versi lama.

Pustaka statis hanyalah kumpulan file objek langsung dari kompiler, sama seperti yang Anda buat sendiri sebagai bagian dari kompilasi proyek Anda, jadi mereka ditarik dan dimasukkan ke linker dengan cara yang persis sama, dan bit yang tidak terpakai adalah dijatuhkan dengan cara yang persis sama.


Saya dapat menguraikan detail DLL di Windows untuk membantu mengklarifikasi misteri tersebut kepada teman-teman saya di sini di *NIX-land...

DLL seperti file Objek Bersama. Keduanya adalah gambar, siap dimuat ke dalam memori oleh pemuat program dari masing-masing OS. Gambar disertai dengan berbagai bit metadata untuk membantu penaut dan pemuat membuat pengaitan yang diperlukan dan menggunakan pustaka kode.

DLL Windows memiliki tabel ekspor. Ekspor dapat dilakukan dengan nama, atau dengan posisi tabel (numerik). Metode yang terakhir dianggap "jadul" dan jauh lebih rapuh - membangun kembali DLL dan mengubah posisi fungsi dalam tabel akan berakhir dengan bencana, sedangkan tidak ada masalah nyata jika menghubungkan titik masuk dengan nama. Jadi, lupakan itu sebagai masalah, tetapi waspadalah jika Anda bekerja dengan kode "dinosaurus" seperti lib vendor pihak ketiga.

DLL Windows dibuat dengan mengkompilasi dan menautkan, sama seperti yang Anda lakukan untuk EXE (aplikasi yang dapat dieksekusi), tetapi DLL dimaksudkan untuk tidak berdiri sendiri, seperti halnya SO dimaksudkan untuk digunakan oleh aplikasi, baik melalui pemuatan dinamis, atau dengan pengikatan waktu-tautan (referensi ke SO disematkan dalam metadata aplikasi biner, dan pemuat program OS akan memuat secara otomatis SO yang direferensikan). DLL dapat mereferensikan DLL lain, sama seperti SO dapat mereferensikan SO lain.

Di Windows, DLL hanya akan menyediakan titik masuk tertentu. Ini disebut "ekspor". Pengembang dapat menggunakan kata kunci kompiler khusus untuk membuat simbol terlihat secara eksternal (untuk penghubung lain dan pemuat dinamis), atau ekspor dapat dicantumkan dalam file definisi modul yang digunakan pada waktu tautan ketika DLL itu sendiri adalah sedang dibuat. Praktik modern adalah menghiasi definisi fungsi dengan kata kunci untuk mengekspor nama simbol. Dimungkinkan juga untuk membuat file header dengan kata kunci yang akan mendeklarasikan simbol tersebut sebagai salah satu yang akan diimpor dari DLL di luar unit kompilasi saat ini. Cari kata kunci __declspec(dllexport) dan __declspec(dllimport) untuk informasi selengkapnya.

Salah satu fitur menarik dari DLL adalah bahwa mereka dapat mendeklarasikan fungsi penangan "saat memuat/membongkar" standar. Setiap kali DLL dimuat atau dibongkar, DLL dapat melakukan beberapa inisialisasi atau pembersihan, tergantung kasusnya. Ini memetakan dengan baik untuk memiliki DLL sebagai pengelola sumber daya berorientasi objek, seperti driver perangkat atau antarmuka objek bersama.

Saat pengembang ingin menggunakan DLL yang sudah dibuat, dia harus mereferensikan "perpustakaan ekspor" (*.LIB) yang dibuat oleh pengembang DLL saat dia membuat DLL, atau dia harus memuat DLL secara eksplisit pada waktu proses dan meminta alamat titik masuk dengan nama melalui mekanisme LoadLibrary() dan GetProcAddress(). Sebagian besar waktu, menautkan ke file LIB (yang hanya berisi metadata tautan untuk titik masuk DLL yang diekspor) adalah cara penggunaan DLL. Pemuatan dinamis biasanya dicadangkan untuk mengimplementasikan "polimorfisme" atau "konfigurasi runtime" dalam perilaku program (mengakses add-on atau fungsionalitas yang ditentukan lebih baru, alias "plugin").

Cara Windows dalam melakukan sesuatu terkadang dapat menyebabkan kebingungan; sistem menggunakan ekstensi .LIB untuk merujuk ke pustaka statis normal (arsip, seperti file POSIX *.a) dan ke pustaka "rintisan ekspor" yang diperlukan untuk mengikat aplikasi ke DLL pada waktu tautan. Jadi, seseorang harus selalu melihat apakah file *.LIB memiliki file *.DLL dengan nama yang sama; jika tidak, kemungkinan besar file *.LIB adalah arsip perpustakaan statis, dan tidak mengekspor metadata yang mengikat untuk DLL.


Linux
  1. Perbedaan antara firewall Perangkat Keras Bersama dan firewall Perangkat Keras Khusus

  2. Perbedaan Antara Shell Login dan Shell Non-login?

  3. Perbedaan Antara [[ $a ==Z* ]] Dan [ $a ==Z* ]?

  1. Perbedaan Antara Eot dan Eof?

  2. Perbedaan Antara [0-9], [[:digit:]] Dan D?

  3. Perbedaan Antara Aplikasi Gtk Dan Qt?

  1. Perbedaan Antara Ukuran Blok Dan Ukuran Cluster?

  2. Perbedaan Antara Snat dan Masquerade?

  3. Mengonversi Perpustakaan Statis menjadi Perpustakaan Bersama?