ไฟล์ DLL และ LIB - คืออะไรและเพราะเหตุใด


214

ฉันรู้น้อยมากเกี่ยวกับ DLL และ LIB นอกเหนือจากนั้นพวกเขามีรหัสที่จำเป็นสำหรับโปรแกรมเพื่อให้ทำงานได้อย่างถูกต้อง - ไลบรารี แต่ทำไมคอมไพเลอร์จึงสร้างมันขึ้นมา? มันจะง่ายกว่าหรือถ้าจะรวมรหัสทั้งหมดไว้ในการปฏิบัติการเดียว? และอะไรคือความแตกต่างระหว่าง DLL และ LIB?


คำตอบ:


298

มีสแตติกไลบรารี (LIB) และไดนามิกไลบรารี (DLL) - แต่โปรดทราบว่าไฟล์. LIB สามารถเป็นสแตติกไลบรารี (ที่มีวัตถุไฟล์) หรือไลบรารีนำเข้า (มีสัญลักษณ์เพื่ออนุญาตให้ลิงเกอร์ลิงก์ไปยัง DLL)

ไลบรารีถูกใช้เนื่องจากคุณอาจมีรหัสที่คุณต้องการใช้ในหลาย ๆ โปรแกรม ตัวอย่างเช่นถ้าคุณเขียนฟังก์ชั่นที่นับจำนวนตัวอักษรในสตริงฟังก์ชันนั้นจะมีประโยชน์ในหลาย ๆ โปรแกรม เมื่อคุณได้รับฟังก์ชั่นการทำงานที่ถูกต้องคุณไม่ต้องการให้คอมไพล์รหัสใหม่ทุกครั้งที่คุณใช้ดังนั้นคุณจึงใส่โค้ดที่สามารถใช้งานได้สำหรับฟังก์ชั่นนั้นลงในไลบรารีและตัวเชื่อมโยงสามารถแยกและแทรกรหัส . ห้องสมุดแบบคงที่บางครั้งเรียกว่า 'คลัง' ด้วยเหตุนี้

ไลบรารีแบบไดนามิกทำให้ก้าวต่อไปอีกขั้นหนึ่ง ดูเหมือนจะไม่มีประโยชน์ที่จะมีฟังก์ชั่นห้องสมุดหลายชุดที่ใช้พื้นที่ในแต่ละโปรแกรม เหตุใดพวกเขาจึงไม่สามารถแบ่งปันฟังก์ชั่นทั้งหมดหนึ่งชุดได้ นี่คือสิ่งที่ไลบรารีแบบไดนามิกมีไว้สำหรับ แทนที่จะสร้างรหัสห้องสมุดลงในโปรแกรมของคุณเมื่อมีการรวบรวมก็สามารถเรียกใช้โดยการทำแผนที่ลงในโปรแกรมของคุณเมื่อมันถูกโหลดลงในหน่วยความจำ โปรแกรมหลายโปรแกรมทำงานในเวลาเดียวกันที่ใช้ฟังก์ชั่นเดียวกันสามารถแบ่งปันหนึ่งสำเนาบันทึกหน่วยความจำ ในความเป็นจริงคุณสามารถโหลดไลบรารีไดนามิกได้ตามต้องการขึ้นอยู่กับเส้นทางผ่านโค้ดของคุณ ไม่มีจุดในการมีเครื่องพิมพ์เป็นประจำหน่วยความจำหากคุณไม่ได้ทำการพิมพ์ใด ๆ ในทางกลับกันหมายความว่าคุณต้องมีสำเนาของไลบรารีแบบไดนามิกที่ติดตั้งในทุกเครื่องที่โปรแกรมของคุณทำงาน

ตัวอย่างเกือบทุกโปรแกรมที่เขียนใน 'C' จะต้องการฟังก์ชั่นจากไลบรารีที่เรียกว่า 'C runtime library แต่โปรแกรมบางโปรแกรมอาจต้องการฟังก์ชันทั้งหมด รันไทม์ C มีทั้งแบบสแตติกและไดนามิกดังนั้นคุณสามารถกำหนดเวอร์ชันที่โปรแกรมของคุณใช้ขึ้นอยู่กับความต้องการเฉพาะ


81
ปรากฎว่า.LIBไฟล์อาจเป็นไลบรารีแบบคงที่ (มีไฟล์วัตถุ) หรือนำเข้าไลบรารี (มีสัญลักษณ์เพื่อให้ตัวเชื่อมโยงเชื่อมโยงไปยัง DLL) ฉันสงสัยว่าทำไมถึงเป็นเช่นนั้น
Lumi

2
คำอธิบายที่ดี! รหัสถูกแชร์และข้อมูล (ต่อค่าเริ่มต้น) ไม่ถูกแชร์ระหว่างแอปพลิเคชันที่ใช้ Dll
mox

4
@Lumi: จุดดี ในแง่ของ DLLs เรามีการเชื่อมโยงสองประเภท การเชื่อมโยงโดยนัยเมื่อเรามี.libไฟล์ที่จัดทำโดยผู้สร้าง DLL พร้อมกับส่วนหัวที่เหมาะสม นี่.libเป็นเพียงตัวบ่งชี้ของ DLL เป้าหมายมันมีที่อยู่จุดเริ่มต้น ฯลฯ แต่ไม่มีรหัส สิ่งนี้.libจะต้องส่งผ่านไปยังตัวเชื่อมโยง อย่างที่สองคือการเชื่อมโยงอย่างชัดเจนเมื่อเราใช้ DLL โดยโหลดด้วยLoadLibraryฟังก์ชั่น ในประเภทนี้เราไม่จำเป็นต้องใช้.libไฟล์นั้น แต่เราต้องใช้ความพยายามเล็กน้อยในการค้นหาการส่งออก DLL ที่อยู่และเรียกฟังก์ชันเหล่านี้ผ่านพอยน์เตอร์
itachi

37

อีกด้านคือความปลอดภัย (obfuscation) เมื่อแยกโค้ดออกจากแอ็พพลิเคชันหลักแล้วใส่ใน Dynamic-Link Library มันจะง่ายต่อการโจมตีวิเคราะห์ (reverse-engineer) โค้ดเนื่องจากมันถูกแยก เมื่อโค้ดชิ้นเดียวกันถูกเก็บไว้ในห้องสมุด LIB มันเป็นส่วนหนึ่งของแอปพลิเคชันเป้าหมายที่เชื่อมโยง (ที่เชื่อมโยง) และทำให้ยากที่จะแยก (แยก) ชิ้นส่วนของรหัสนั้นจากส่วนที่เหลือของไบนารีเป้าหมาย


ด้านความปลอดภัยใหม่สำหรับฉัน การใช้เหตุผลด้านบนถือเป็นจริงในกรณีของแอป C # ที่เรียกใช้ C ++ dll ที่ไม่มีการจัดการหรือไม่
มาร์ติน

1
แต่ LIB ก็ถูกแยกออกเช่นกันใช่ไหม ดังนั้นผู้โจมตีสามารถวิเคราะห์ LIB ได้ หรือเป็นสถานการณ์ทั่วไปที่ LIB ไม่สามารถเข้าถึงได้โดยสาธารณะ?
Nick Russler

8
LIB นั้น "โดดเดี่ยว" เช่นกันตราบใดที่กระบวนการคอมไพเลอร์เกี่ยวข้อง แต่เมื่อตัวเชื่อมโยงใส่ส่วนต่างๆเข้าด้วยกัน LIB ก็เป็นส่วนหนึ่งของ EXE และไม่สามารถแยกความแตกต่างจากรหัสของคุณเองได้
mox

17

เหตุผลหนึ่งที่สำคัญสำหรับการสร้าง DLL / LIB แทนที่จะรวบรวมโค้ดลงในไฟล์เรียกทำงานก็คือการนำมาใช้ใหม่และย้ายตำแหน่ง แอปพลิเคชัน Java หรือ. NET โดยเฉลี่ย (ตัวอย่าง) มีแนวโน้มที่จะใช้ไลบรารีบุคคลที่สาม (หรือกรอบงาน) หลายแห่ง มันง่ายกว่าและเร็วกว่าในการรวบรวมไลบรารีที่สร้างไว้ล่วงหน้าแทนที่จะต้องรวบรวมรหัสของบุคคลที่สามทั้งหมดในแอปพลิเคชันของคุณ การคอมไพล์โค้ดของคุณลงในไลบรารี่ยังสนับสนุนการออกแบบที่ดีเช่นการออกแบบคลาสของคุณเพื่อใช้ในแอพพลิเคชั่นประเภทต่างๆ


7

DLL เป็นไลบรารีของฟังก์ชันที่ใช้ร่วมกันระหว่างโปรแกรมปฏิบัติการอื่น ๆ เพียงแค่ดูในไดเรกทอรี windows / system32 ของคุณแล้วคุณจะพบหลายสิบ เมื่อโปรแกรมของคุณสร้าง DLL มันก็จะสร้างไฟล์ lib เพื่อให้แอปพลิเคชัน * .exe สามารถแก้ไขสัญลักษณ์ที่ประกาศใน DLL ได้

.lib เป็นไลบรารีของฟังก์ชันที่เชื่อมโยงกับโปรแกรมแบบคงที่ซึ่งไม่ได้ใช้ร่วมกับโปรแกรมอื่น แต่ละโปรแกรมที่เชื่อมโยงกับไฟล์ * .lib มีรหัสทั้งหมดในไฟล์นั้น หากคุณมีสองโปรแกรม A.exe และ B.exe ที่ลิงก์กับ C.lib ดังนั้น A และ B แต่ละโปรแกรมจะมีรหัสใน C.lib

วิธีที่คุณสร้าง DLLs และ libs ขึ้นอยู่กับคอมไพเลอร์ที่คุณใช้ คอมไพเลอร์แต่ละตัวมันแตกต่างกัน


4

ความแตกต่างอีกอย่างหนึ่งคือประสิทธิภาพ

เนื่องจาก DLL ถูกโหลดที่รันไทม์โดย. exe ดังนั้น. exe และ DLL จึงทำงานร่วมกับแนวคิดหน่วยความจำที่ใช้ร่วมกันดังนั้นประสิทธิภาพจึงค่อนข้างต่ำเมื่อเทียบกับการเชื่อมโยงแบบสแตติก

ในอีกทางหนึ่ง. lib เป็นรหัสที่เชื่อมโยงแบบคงที่เวลารวบรวมในทุกกระบวนการที่ร้องขอ ดังนั้น. exe จะมีหน่วยความจำเดียวซึ่งจะเป็นการเพิ่มประสิทธิภาพของกระบวนการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.