ฉันกำลังอ่านเกี่ยวกับไลบรารีใน C แต่ฉันยังไม่พบคำอธิบายเกี่ยวกับวัตถุไฟล์ อะไรคือความแตกต่างที่แท้จริงระหว่างไฟล์ที่คอมไพล์แล้วกับไฟล์ออบเจ็กต์?
ฉันจะดีใจถ้ามีใครสามารถอธิบายเป็นภาษามนุษย์ได้
ฉันกำลังอ่านเกี่ยวกับไลบรารีใน C แต่ฉันยังไม่พบคำอธิบายเกี่ยวกับวัตถุไฟล์ อะไรคือความแตกต่างที่แท้จริงระหว่างไฟล์ที่คอมไพล์แล้วกับไฟล์ออบเจ็กต์?
ฉันจะดีใจถ้ามีใครสามารถอธิบายเป็นภาษามนุษย์ได้
คำตอบ:
อ็อบเจ็กต์ไฟล์คือเอาต์พุตจริงจากเฟสการรวบรวม ส่วนใหญ่เป็นรหัสเครื่อง แต่มีข้อมูลที่อนุญาตให้ linker ดูว่ามีสัญลักษณ์ใดบ้างรวมถึงสัญลักษณ์ที่ต้องการเพื่อให้สามารถใช้งานได้ (สำหรับการอ้างอิง "สัญลักษณ์" เป็นชื่อของวัตถุทั่วโลกฟังก์ชั่น ฯลฯ )
ตัวเชื่อมโยงใช้ไฟล์วัตถุเหล่านี้ทั้งหมดและรวมเข้าด้วยกันเพื่อสร้างไฟล์ปฏิบัติการหนึ่งไฟล์ (สมมติว่าสามารถทำได้เช่น: ไม่มีสัญลักษณ์ที่ซ้ำกันหรือไม่ได้กำหนด) คอมไพเลอร์จำนวนมากจะทำสิ่งนี้ให้คุณ (อ่าน: พวกมันรัน linker ด้วยตัวเอง) ถ้าคุณไม่บอกให้คอมไพล์ "แค่คอมไพล์" โดยใช้ตัวเลือกบรรทัดคำสั่ง ( -c
เป็นตัวเลือก "คอมไพล์ทั่วไป" อย่าลิงก์ ")
ไฟล์ Object เป็นไฟล์ที่รวบรวม ไม่มีความแตกต่างระหว่างทั้งสอง
ไฟล์ที่เรียกทำงานได้จะเกิดขึ้นจากการลิงก์ไฟล์ Object
ไฟล์อ็อบเจ็กต์มีคำแนะนำในระดับต่ำซึ่ง CPU สามารถเข้าใจได้ นั่นคือสาเหตุที่เรียกว่ารหัสเครื่อง
รหัสเครื่องในระดับต่ำนี้เป็นการแสดงแบบไบนารี่ของคำสั่งที่คุณสามารถเขียนได้โดยตรงโดยใช้ภาษาแอสเซมบลีแล้วประมวลผลรหัสภาษาแอสเซมบลี (แสดงเป็นภาษาอังกฤษ) เป็นภาษาเครื่อง (แสดงเป็น Hex) โดยใช้แอสเซมเบลอร์
นี่คือโฟลว์ระดับสูงทั่วไปสำหรับกระบวนการนี้สำหรับโค้ดในภาษาระดับสูงเช่น C
-> ต้องผ่านตัวประมวลผลล่วงหน้า
-> เพื่อให้รหัสที่เหมาะสมยังอยู่ใน C
-> ต้องผ่านผู้เรียบเรียง
-> เพื่อให้รหัสการประกอบ
-> ต้องผ่านแอสเซมเบลอร์
-> เพื่อให้รหัสในภาษาเครื่องซึ่งเก็บไว้ใน OBJECT FILES
-> ต้องผ่านตัวเชื่อมโยง
-> เพื่อรับไฟล์ที่ปฏิบัติการได้
โฟลว์นี้สามารถมีการเปลี่ยนแปลงบางอย่างเช่นคอมไพเลอร์ส่วนใหญ่สามารถสร้างรหัสภาษาของเครื่องได้โดยตรงโดยไม่ต้องผ่านแอสเซมเบลอร์ ในทำนองเดียวกันพวกเขาสามารถทำการประมวลผลล่วงหน้าให้กับคุณ ถึงกระนั้นก็ดีการแบ่งองค์ประกอบเพื่อความเข้าใจที่ดีขึ้น
มีอ็อบเจ็กต์ไฟล์ 3 ชนิด
มีรหัสเครื่องในรูปแบบที่สามารถรวมกับไฟล์อ็อบเจ็กต์ relocatable อื่น ๆ ในเวลาลิงก์เพื่อสร้างไฟล์อ็อบเจ็กต์ที่เรียกทำงานได้
หากคุณมีa.c
ไฟล์ต้นฉบับในการสร้างไฟล์วัตถุด้วย GCC คุณควรรัน:
gcc a.c -c
กระบวนการทั้งหมดจะเป็น: preprocessor (cpp) จะทำงานมากกว่า ac เอาท์พุท (แหล่งที่มายังคง) จะฟีดเข้าไปในคอมไพเลอร์ (cc1) เอาท์พุท (งานประกอบ) จะป้อนเข้าสู่ประกอบ (เป็น) relocatable object file
ซึ่งจะผลิต ไฟล์นั้นมีรหัสวัตถุและการเชื่อมโยง (และการดีบักหาก-g
ใช้) ข้อมูลเมตาและไม่สามารถเรียกใช้งานได้โดยตรง
ไฟล์อ็อบเจ็กต์ relocatable ชนิดพิเศษที่สามารถโหลดแบบไดนามิกทั้งในเวลาโหลดหรือเวลารันไทม์ ไลบรารีที่แบ่งใช้เป็นตัวอย่างของวัตถุประเภทนี้
มีรหัสเครื่องที่สามารถโหลดเข้าสู่หน่วยความจำโดยตรง (โดยโหลดเดอร์เช่นexecve ) และดำเนินการในภายหลัง
ผลของการใช้ลิงเกอร์กว่าหลายเป็นrelocatable object files
executable object file
ตัวเชื่อมโยงผสานไฟล์วัตถุอินพุตทั้งหมดจากบรรทัดคำสั่งจากซ้ายไปขวาโดยการรวมส่วนอินพุตประเภทเดียวกันทั้งหมด (เช่น.data
) เข้ากับส่วนเอาต์พุตชนิดเดียวกัน มันใช้และsymbol resolution
relocation
เมื่อเชื่อมโยงกับstatic library
ฟังก์ชั่นที่อ้างอิงในวัตถุอินพุตจะถูกคัดลอกไปยังไฟล์ปฏิบัติการขั้นสุดท้าย ด้วยdynamic libraries
ตารางสัญลักษณ์ถูกสร้างขึ้นแทนที่จะเปิดใช้งานการเชื่อมโยงแบบไดนามิกกับฟังก์ชั่น / globals ของห้องสมุด ดังนั้นผลลัพธ์คือไฟล์อ็อบเจ็กต์ที่รันได้บางส่วนเนื่องจากขึ้นอยู่กับไลบรารี หากไม่มีไลบรารีไฟล์จะไม่สามารถทำงานได้อีกต่อไป)
กระบวนการเชื่อมโยงสามารถทำได้ดังนี้:
ld a.o -o myexecutable
คำสั่ง: gcc a.c -o myexecutable
จะเรียกใช้คำสั่งทั้งหมดที่กล่าวถึงที่จุด 1 และที่จุด 3 (cpp -> cc1 -> as -> ld 1 )
1: จริงๆแล้วคือ collect2 ซึ่งเป็น wrapper มากกว่า ld
อ็อบเจ็กต์ไฟล์เป็นสิ่งที่คุณได้รับเมื่อคุณคอมไพล์ไฟล์หนึ่งไฟล์ (หรือหลายไฟล์)
มันอาจเป็นไฟล์ปฏิบัติการหรือไลบรารีที่สมบูรณ์หรือไฟล์ระดับกลาง
โดยทั่วไปไฟล์อ็อบเจ็กต์จะมีโค้ดเนทีฟข้อมูลตัวลิงก์สัญลักษณ์การดีบักและอื่น ๆ
ไฟล์วัตถุคือรหัสที่ขึ้นอยู่กับฟังก์ชั่นสัญลักษณ์และข้อความเพื่อเรียกใช้โปรแกรม เช่นเดียวกับเครื่องเทเล็กซ์รุ่นเก่าซึ่งต้องใช้ระบบพิมพ์ดีดเพื่อส่งสัญญาณไปยังเครื่องเทเล็กซ์อื่น ๆ
ในทำนองเดียวกันตัวประมวลผลจำเป็นต้องใช้รหัสไบนารี่เพื่อเรียกใช้ไฟล์ออบเจ็กต์จะเหมือนกับรหัสไบนารี่ แต่ไม่ได้เชื่อมโยง การเชื่อมโยงสร้างไฟล์เพิ่มเติมเพื่อให้ผู้ใช้ไม่จำเป็นต้องรวบรวมภาษา C ด้วยตนเอง ผู้ใช้สามารถเปิดไฟล์ exe ได้โดยตรงเมื่อไฟล์ออบเจ็กต์เชื่อมโยงกับคอมไพเลอร์เช่นภาษาซีหรือ vb เป็นต้น