ไฟล์วัตถุใน C คืออะไร?


140

ฉันกำลังอ่านเกี่ยวกับไลบรารีใน C แต่ฉันยังไม่พบคำอธิบายเกี่ยวกับวัตถุไฟล์ อะไรคือความแตกต่างที่แท้จริงระหว่างไฟล์ที่คอมไพล์แล้วกับไฟล์ออบเจ็กต์?
ฉันจะดีใจถ้ามีใครสามารถอธิบายเป็นภาษามนุษย์ได้


รุ่นที่ใช้งานได้มากกว่านี้: stackoverflow.com/questions/12122446/ …
Ciro Santilli 法轮功冠状病病六四事件法轮功

คำตอบ:


153

อ็อบเจ็กต์ไฟล์คือเอาต์พุตจริงจากเฟสการรวบรวม ส่วนใหญ่เป็นรหัสเครื่อง แต่มีข้อมูลที่อนุญาตให้ linker ดูว่ามีสัญลักษณ์ใดบ้างรวมถึงสัญลักษณ์ที่ต้องการเพื่อให้สามารถใช้งานได้ (สำหรับการอ้างอิง "สัญลักษณ์" เป็นชื่อของวัตถุทั่วโลกฟังก์ชั่น ฯลฯ )

ตัวเชื่อมโยงใช้ไฟล์วัตถุเหล่านี้ทั้งหมดและรวมเข้าด้วยกันเพื่อสร้างไฟล์ปฏิบัติการหนึ่งไฟล์ (สมมติว่าสามารถทำได้เช่น: ไม่มีสัญลักษณ์ที่ซ้ำกันหรือไม่ได้กำหนด) คอมไพเลอร์จำนวนมากจะทำสิ่งนี้ให้คุณ (อ่าน: พวกมันรัน linker ด้วยตัวเอง) ถ้าคุณไม่บอกให้คอมไพล์ "แค่คอมไพล์" โดยใช้ตัวเลือกบรรทัดคำสั่ง ( -cเป็นตัวเลือก "คอมไพล์ทั่วไป" อย่าลิงก์ ")


ที่จริงแล้วด้วยคอมไพเลอร์ส่วนใหญ่เอาต์พุตจากเฟสการคอมไพล์คือรหัสแอสเซมบลีและคอมไพเลอร์จะเรียกใช้แอสเซมเบลอร์เพื่อเปลี่ยนให้เป็นไฟล์วัตถุ
Chris Dodd

15
@ChrisDodd: นั่นมักจะเป็นกรณีที่คอมไพเลอร์รุ่นเก่า วันนี้คอมไพเลอร์จะไม่สร้างรหัสแอสเซมบลีเว้นแต่คุณจะขอและมักจะไม่ใช้ภายใน แต่ไม่ว่าด้วยวิธีใดแอสเซมบลีจะเป็นเฟสย่อยของเฟสการรวบรวม
cHao

2
สามารถเรียกใช้ไฟล์อ็อบเจ็กต์ไฟล์เดียวได้หรือไม่
น้ำผึ้ง

1
@ เงิน: โดยทั่วไปไม่ แม้ว่าไฟล์ออบเจ็กต์จะอยู่ในรูปแบบที่ออกแบบมาสำหรับการดำเนินการ (ซึ่งโดยทั่วไปแล้วมันไม่เคยเป็น) ส่วนนั้นเกี่ยวกับ "สัญลักษณ์ที่ต้องใช้เพื่อการทำงาน" โดยทั่วไปแล้วจะฆ่าข้อตกลง แม้แต่ "สวัสดีโลก" มาตรฐานของคุณก็ยังต้องการการเชื่อมโยงกับ C runtime library
cHao

74
  1. ไฟล์ Object เป็นไฟล์ที่รวบรวม ไม่มีความแตกต่างระหว่างทั้งสอง

  2. ไฟล์ที่เรียกทำงานได้จะเกิดขึ้นจากการลิงก์ไฟล์ Object

  3. ไฟล์อ็อบเจ็กต์มีคำแนะนำในระดับต่ำซึ่ง CPU สามารถเข้าใจได้ นั่นคือสาเหตุที่เรียกว่ารหัสเครื่อง

  4. รหัสเครื่องในระดับต่ำนี้เป็นการแสดงแบบไบนารี่ของคำสั่งที่คุณสามารถเขียนได้โดยตรงโดยใช้ภาษาแอสเซมบลีแล้วประมวลผลรหัสภาษาแอสเซมบลี (แสดงเป็นภาษาอังกฤษ) เป็นภาษาเครื่อง (แสดงเป็น Hex) โดยใช้แอสเซมเบลอร์

นี่คือโฟลว์ระดับสูงทั่วไปสำหรับกระบวนการนี้สำหรับโค้ดในภาษาระดับสูงเช่น C

-> ต้องผ่านตัวประมวลผลล่วงหน้า

-> เพื่อให้รหัสที่เหมาะสมยังอยู่ใน C

-> ต้องผ่านผู้เรียบเรียง

-> เพื่อให้รหัสการประกอบ

-> ต้องผ่านแอสเซมเบลอร์

-> เพื่อให้รหัสในภาษาเครื่องซึ่งเก็บไว้ใน OBJECT FILES

-> ต้องผ่านตัวเชื่อมโยง

-> เพื่อรับไฟล์ที่ปฏิบัติการได้

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


5
รหัสที่ได้รับการปรับปรุงไม่ได้ถูกสร้างขึ้นที่ตัวประมวลผลล่วงหน้าหรือในทันทีหลังจากนั้น ตัวประมวลผลล่วงหน้าเกี่ยวข้องเฉพาะกับภาษาของตัวเองเท่านั้น การเพิ่มประสิทธิภาพเกิดขึ้นในขั้นตอนการรวบรวมและประกอบ
Ignas2526

เป็นไฟล์ออบเจ็กต์ที่เราได้รับหลังจากคอมไพล์เช่นเดียวกับไฟล์ปฏิบัติการในภาษาเครื่อง ฉันสับสนเพราะคุณบอกว่าไฟล์อ็อบเจ็กต์ถูกสร้างในขั้นตอนที่สองจากขั้นตอนสุดท้ายและขั้นตอนสุดท้ายคือไฟล์ปฏิบัติการ ดังนั้นไฟล์. 0 ที่เราได้รับหลังจากการคอมไพล์ไฟล์ปฏิบัติการนั้นคืออะไร?
AV94

ไม่สามารถเรียกใช้ไฟล์อ็อบเจ็กต์ไฟล์เดียวได้
น้ำผึ้ง

33

มีอ็อบเจ็กต์ไฟล์ 3 ชนิด

ไฟล์อ็อบเจ็กต์ relocatable

มีรหัสเครื่องในรูปแบบที่สามารถรวมกับไฟล์อ็อบเจ็กต์ 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 resolutionrelocation

อ่านโบนัส:

เมื่อเชื่อมโยงกับ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


11

อ็อบเจ็กต์ไฟล์เป็นสิ่งที่คุณได้รับเมื่อคุณคอมไพล์ไฟล์หนึ่งไฟล์ (หรือหลายไฟล์)

มันอาจเป็นไฟล์ปฏิบัติการหรือไลบรารีที่สมบูรณ์หรือไฟล์ระดับกลาง

โดยทั่วไปไฟล์อ็อบเจ็กต์จะมีโค้ดเนทีฟข้อมูลตัวลิงก์สัญลักษณ์การดีบักและอื่น ๆ


2

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

ในทำนองเดียวกันตัวประมวลผลจำเป็นต้องใช้รหัสไบนารี่เพื่อเรียกใช้ไฟล์ออบเจ็กต์จะเหมือนกับรหัสไบนารี่ แต่ไม่ได้เชื่อมโยง การเชื่อมโยงสร้างไฟล์เพิ่มเติมเพื่อให้ผู้ใช้ไม่จำเป็นต้องรวบรวมภาษา C ด้วยตนเอง ผู้ใช้สามารถเปิดไฟล์ exe ได้โดยตรงเมื่อไฟล์ออบเจ็กต์เชื่อมโยงกับคอมไพเลอร์เช่นภาษาซีหรือ vb เป็นต้น

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