Tập tin đối tượng trong C là gì?


140

Tôi đang đọc về các thư viện trong C nhưng tôi chưa tìm thấy lời giải thích về tệp đối tượng là gì. Sự khác biệt thực sự giữa bất kỳ tệp được biên dịch khác và một tệp đối tượng là gì?
Tôi sẽ rất vui nếu ai đó có thể giải thích bằng ngôn ngữ của con người.


Một phiên bản tích cực hơn của điều này: stackoverflow.com/questions/12122446/
Kẻ

Câu trả lời:


153

Một tệp đối tượng là đầu ra thực từ giai đoạn biên dịch. Nó chủ yếu là mã máy, nhưng có thông tin cho phép một trình liên kết xem các ký hiệu trong đó cũng như các ký hiệu mà nó yêu cầu để hoạt động. (Để tham khảo, "biểu tượng" về cơ bản là tên của các đối tượng, hàm, v.v.)

Một trình liên kết lấy tất cả các tệp đối tượng này và kết hợp chúng để tạo thành một tệp thực thi (giả sử rằng nó có thể, nghĩa là: không có bất kỳ ký hiệu trùng lặp hoặc không xác định nào). Rất nhiều trình biên dịch sẽ làm điều này cho bạn (đọc: họ tự chạy trình liên kết) nếu bạn không bảo họ "chỉ biên dịch" bằng các tùy chọn dòng lệnh. ( -clà một tùy chọn "chỉ biên dịch; không liên kết" phổ biến.)


Trên thực tế, với hầu hết các trình biên dịch, đầu ra từ giai đoạn biên dịch là mã lắp ráp và sau đó trình biên dịch sẽ gọi trình biên dịch để biến nó thành một tệp đối tượng.
Chris Dodd

15
@ChrisDodd: Đó thường là trường hợp với trình biên dịch cũ. Ngày nay, trình biên dịch sẽ không tạo mã lắp ráp trừ khi bạn yêu cầu và thường không sử dụng nó trong nội bộ. Nhưng dù bằng cách nào, lắp ráp sẽ là một giai đoạn phụ của giai đoạn biên dịch, vì vậy tất cả đó là moot.
cHao

2
một tập tin đối tượng có thể được thực thi?
Mật ong

1
@Honey: Nói chung là không. Ngay cả khi tệp đối tượng ở định dạng được thiết kế để thực thi (mà về cơ bản là không bao giờ), phần đó về "các ký hiệu mà nó yêu cầu để hoạt động" về cơ bản sẽ giết chết thỏa thuận. Ngay cả "thế giới xin chào" tiêu chuẩn của bạn cũng yêu cầu liên kết với thư viện thời gian chạy C.
cHao

74
  1. Một tệp Object là chính tệp được biên dịch. Không có sự khác biệt giữa hai.

  2. Một tệp thực thi được hình thành bằng cách liên kết các tệp Object.

  3. Tệp đối tượng chứa các hướng dẫn mức thấp mà CPU có thể hiểu được. Đó là lý do tại sao nó còn được gọi là mã máy.

  4. Mã máy cấp thấp này là biểu diễn nhị phân của các hướng dẫn mà bạn cũng có thể viết trực tiếp bằng ngôn ngữ hợp ngữ và sau đó xử lý mã ngôn ngữ lắp ráp (được trình bày bằng tiếng Anh) thành ngôn ngữ máy (được biểu thị bằng Hex) bằng trình biên dịch.

Đây là luồng cấp cao điển hình cho quy trình này cho mã bằng Ngôn ngữ cấp cao, chẳng hạn như C

-> đi qua bộ xử lý trước

-> để cung cấp mã được tối ưu hóa, vẫn trong C

-> đi qua trình biên dịch

-> để cung cấp mã lắp ráp

-> đi qua một trình biên dịch

-> để cung cấp mã bằng ngôn ngữ máy được lưu trữ trong BỘ ĐỐI TƯỢNG

-> đi qua Trình liên kết

-> để có được một tập tin thực thi.

Luồng này có thể có một số biến thể, ví dụ như hầu hết các trình biên dịch có thể trực tiếp tạo mã ngôn ngữ máy, mà không cần thông qua trình biên dịch. Tương tự, họ có thể làm tiền xử lý cho bạn. Tuy nhiên, thật tốt khi chia tay các thành phần để hiểu rõ hơn.


5
Mã được tối ưu hóa không được tạo ở giai đoạn tiền xử lý cũng như ngay sau mã. Bộ xử lý trước chỉ xử lý ngôn ngữ của chính nó và đó là nó. Tối ưu hóa xảy ra ở giai đoạn biên soạn và lắp ráp.
Ignas2526

Là tệp đối tượng chúng ta nhận được sau khi biên dịch giống như tệp thực thi trong ngôn ngữ máy. Tôi bối rối bởi vì, bạn nói rằng tệp đối tượng được tạo ở bước thứ hai từ bước cuối cùng và bước cuối cùng là tệp thực thi. Vì vậy, tệp .0 chúng tôi nhận được sau khi biên dịch, đó có phải là tệp thực thi không?
AV94

một tập tin đối tượng cũng có thể được thực thi?
Mật ong

33

Có 3 loại tệp đối tượng.

Tập tin đối tượng di dời

Chứa mã máy ở dạng có thể được kết hợp với các tệp đối tượng có thể định vị lại khác tại thời điểm liên kết, để tạo thành tệp đối tượng thực thi.

Nếu bạn có a.ctệp nguồn, để tạo tệp đối tượng của nó bằng GCC, bạn nên chạy: gcc a.c -c

Toàn bộ quá trình sẽ là: tiền xử lý (cpp) sẽ chạy trên ac Đầu ra của nó (nguồn tĩnh) sẽ cung cấp cho trình biên dịch (cc1). Đầu ra (lắp ráp) của nó sẽ cung cấp cho trình biên dịch chương trình (as), sẽ tạo ra relocatable object file. Tệp đó chứa mã đối tượng và -gsiêu dữ liệu liên kết (và gỡ lỗi nếu được sử dụng) và không thể thực thi trực tiếp.

Tệp đối tượng chia sẻ

Loại đặc biệt của tệp đối tượng có thể định vị lại có thể được tải động, tại thời điểm tải hoặc tại thời gian chạy. Thư viện dùng chung là một ví dụ về các loại đối tượng này.

Tệp đối tượng thực thi

Chứa mã máy mà có thể được nạp trực tiếp vào bộ nhớ (bởi bộ nạp, ví dụ như execve ) và sau đó thực hiện.

Kết quả của việc chạy trình liên kết qua nhiều relocatable object fileslà một executable object file. Trình liên kết hợp nhất tất cả các tệp đối tượng đầu vào từ dòng lệnh, từ trái sang phải, bằng cách hợp nhất tất cả các phần đầu vào cùng loại (ví dụ .data) vào phần đầu ra cùng loại. Nó sử dụng symbol resolutionrelocation.

Phần thưởng đọc:

Khi liên kết với một static libraryhàm được tham chiếu trong các đối tượng đầu vào được sao chép vào tệp thực thi cuối cùng. Với dynamic librariesmột bảng biểu tượng được tạo thay vào đó sẽ cho phép liên kết động với các chức năng / toàn cầu của thư viện. Do đó, kết quả là một tệp đối tượng thực thi một phần, vì nó phụ thuộc vào thư viện. Nếu thư viện không tồn tại, tệp không thể thực thi được nữa).

Quá trình liên kết có thể được thực hiện như sau: ld a.o -o myexecutable

Lệnh: gcc a.c -o myexecutablesẽ gọi tất cả các lệnh được đề cập tại điểm 1 và tại điểm 3 (cpp -> cc1 -> as -> ld 1 )

1: thực sự là coll2, là một trình bao bọc trên ld.


11

Một tệp đối tượng chỉ là những gì bạn nhận được khi biên dịch một (hoặc một vài) tệp nguồn.

Nó có thể là một tệp thực thi hoặc thư viện hoàn thành đầy đủ, hoặc các tệp trung gian.

Các tệp đối tượng thường chứa mã gốc, thông tin liên kết, ký hiệu gỡ lỗi, v.v.


2

Các tệp đối tượng là các mã phụ thuộc vào chức năng, ký hiệu và văn bản để chạy chương trình. Cũng giống như các máy telex cũ, yêu cầu teletyping để gửi tín hiệu đến các máy telex khác.

Theo cùng một cách bộ xử lý yêu cầu mã nhị phân để chạy, các tệp đối tượng giống như mã nhị phân nhưng không được liên kết. Liên kết tạo các tệp bổ sung để người dùng không phải tự biên dịch ngôn ngữ C. Người dùng có thể trực tiếp mở tệp exe khi tệp đối tượng được liên kết với một số trình biên dịch như ngôn ngữ c hoặc vb, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.