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.c
tệ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à -g
siê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 files
là 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 resolution
và relocation
.
Phần thưởng đọc:
Khi liên kết với một static library
hà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 libraries
mộ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 myexecutable
sẽ 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.