File DLL dan LIB - apa dan mengapa?

214

Saya tahu sedikit tentang DLL dan LIB selain itu mengandung kode penting yang diperlukan agar program dapat berjalan dengan baik - perpustakaan. Tetapi mengapa kompiler menghasilkannya? Bukankah lebih mudah untuk hanya memasukkan semua kode dalam satu executable? Dan apa perbedaan antara DLL dan LIB?

Xonara
sumber

Jawaban:

298

Ada perpustakaan statis (LIB) dan perpustakaan dinamis (DLL) - tetapi perhatikan bahwa file .LIB dapat berupa perpustakaan statis (berisi file objek) atau mengimpor perpustakaan (berisi simbol untuk memungkinkan linker untuk menautkan ke DLL).

Perpustakaan digunakan karena Anda mungkin memiliki kode yang ingin Anda gunakan di banyak program. Misalnya jika Anda menulis fungsi yang menghitung jumlah karakter dalam sebuah string, fungsi itu akan berguna dalam banyak program. Setelah Anda menjalankan fungsi itu dengan benar, Anda tidak ingin harus mengkompilasi ulang kode setiap kali menggunakannya, jadi Anda meletakkan kode yang dapat dieksekusi untuk fungsi itu di perpustakaan, dan penghubung dapat mengekstrak dan menyisipkan kode yang dikompilasi ke dalam program Anda . Perpustakaan statis kadang-kadang disebut 'arsip' karena alasan ini.

Perpustakaan dinamis mengambil satu langkah lebih jauh. Tampaknya boros memiliki banyak salinan fungsi perpustakaan yang menghabiskan ruang di masing-masing program. Mengapa mereka tidak bisa berbagi satu salinan fungsi? Inilah gunanya perpustakaan dinamis. Alih-alih membangun kode perpustakaan ke dalam program Anda ketika dikompilasi, ia dapat dijalankan dengan memetakannya ke dalam program Anda saat kode tersebut dimuat ke dalam memori. Beberapa program yang berjalan pada saat yang sama yang menggunakan fungsi yang sama semuanya dapat berbagi satu salinan, menghemat memori. Bahkan, Anda dapat memuat pustaka dinamis hanya sesuai kebutuhan, tergantung pada jalur melalui kode Anda. Tidak ada gunanya membuat rutinitas printer menghabiskan memori jika Anda tidak melakukan pencetakan apa pun. Di sisi lain, ini berarti Anda harus memiliki salinan perpustakaan dinamis yang diinstal pada setiap mesin yang menjalankan program Anda.

Sebagai contoh, hampir setiap program yang ditulis dalam 'C' akan membutuhkan fungsi dari pustaka yang disebut 'C runtime library, meskipun beberapa program membutuhkan semua fungsi tersebut. C runtime hadir dalam versi statis dan dinamis, sehingga Anda dapat menentukan versi mana yang digunakan program Anda tergantung pada kebutuhan tertentu.

Charles E. Grant
sumber
81
Ternyata .LIBfile dapat berupa pustaka statis (berisi file objek) atau mengimpor pustaka (berisi simbol untuk memungkinkan tautan untuk menautkan ke DLL). Saya bertanya-tanya mengapa demikian.
Lumi
2
penjelasan yang bagus! Kode dibagikan dan data (per default) tidak dibagi antara aplikasi yang menggunakan Dll.
mox
4
@Lumi: Poin bagus. Dalam hal DLL kami memiliki dua jenis tautan. Penautan implisit , ketika kami memiliki .libfile yang disediakan oleh pembuat DLL bersama dengan tajuk yang sesuai; ini .libhanyalah deskriptor dari target DLL, ini berisi alamat, titik masuk, dll. tetapi tidak ada kode. Ini .libharus diteruskan ke tautan. Yang kedua adalah tautan eksplisit ketika kami menggunakan DLL dengan memuatnya secara manual dengan LoadLibraryfungsi. Dalam tipe ini kita tidak memerlukan .libfile itu, tetapi kita harus berusaha sedikit untuk menemukan ekspor DLL, alamatnya, dan memanggil fungsi-fungsi ini melalui pointer.
itachi
37

Aspek lain adalah keamanan (kebingungan). Setelah sepotong kode diekstraksi dari aplikasi utama dan dimasukkan ke dalam Dynamic-Link Library yang "terpisah", lebih mudah untuk menyerang, menganalisis (merekayasa balik) kode tersebut, karena telah diisolasi. Ketika potongan kode yang sama disimpan di Perpustakaan LIB, itu adalah bagian dari aplikasi target yang dikompilasi (terhubung), dan ini dengan demikian lebih sulit untuk mengisolasi (membedakan) potongan kode dari sisa binari target.

mox
sumber
Aspek keamanan baru bagi saya. Apakah alasan di atas berlaku dalam kasus aplikasi C # yang memanggil asli asli C ++ dll?
Martin
1
Tapi LIB juga terisolasi, bukan? Jadi Penyerang bisa menganalisis LIB. Atau apakah ini merupakan skenario umum bahwa LIB tidak dapat diakses oleh publik?
Nick Russler
8
LIB "terisolasi" juga, sejauh menyangkut proses kompiler, tetapi begitu penghubung menempatkan bagian-bagiannya, LIB adalah bagian dari EXE dan tidak dapat dibedakan dari kode Anda sendiri.
mox
17

Salah satu alasan penting untuk membuat DLL / LIB daripada hanya mengkompilasi kode menjadi executable adalah penggunaan kembali dan relokasi. Rata-rata aplikasi Java atau .NET (misalnya) kemungkinan besar akan menggunakan beberapa pustaka pihak ketiga (atau kerangka kerja). Jauh lebih mudah dan lebih cepat untuk hanya mengkompilasi terhadap perpustakaan yang sudah dibangun, daripada harus mengkompilasi semua kode pihak ke-3 ke dalam aplikasi Anda. Mengkompilasi kode Anda ke perpustakaan juga mendorong praktik desain yang baik, misalnya merancang kelas Anda untuk digunakan dalam berbagai jenis aplikasi.

Andy White
sumber
7

DLL adalah pustaka fungsi yang dibagikan di antara program yang dapat dieksekusi lainnya. Lihat saja di direktori windows / system32 Anda dan Anda akan menemukan lusinan di antaranya. Ketika program Anda membuat DLL itu juga biasanya membuat file lib sehingga program aplikasi * .exe dapat menyelesaikan simbol yang dinyatakan dalam DLL.

.Lib adalah pustaka fungsi yang secara statis terhubung ke suatu program - mereka TIDAK dibagi oleh program lain Setiap program yang terhubung dengan file * .lib memiliki semua kode dalam file itu. Jika Anda memiliki dua program, A.exe dan B.exe yang terhubung dengan C.lib, maka masing-masing A dan B keduanya akan berisi kode dalam C.lib.

Cara Anda membuat DLL dan lib bergantung pada kompiler yang Anda gunakan. Setiap kompiler melakukannya secara berbeda.

Vinodhini Ramasamy
sumber
4

Satu perbedaan lain terletak pada kinerja.

Karena DLL dimuat pada saat runtime oleh .exe (s), .exe (s) dan DLL bekerja dengan konsep memori bersama dan karenanya kinerjanya relatif rendah untuk menghubungkan statis.

Di sisi lain, .lib adalah kode yang terhubung secara statis pada waktu kompilasi ke dalam setiap proses yang diminta. Oleh karena itu .exe akan memiliki memori tunggal, sehingga meningkatkan kinerja proses.

Girish Reddyvari
sumber