Định dạng tệp đối tượng Mach-O được Mac OS X sử dụng cho các tệp thực thi và thư viện phân biệt giữa các thư viện dùng chung và các mô-đun được tải động . Sử dụng otool -hv some_file
để xem filetype của some_file
.
Các thư viện dùng chung Mach-O có loại tệp MH_DYLIB
và mang phần mở rộng .dylib. Chúng có thể được liên kết với các cờ liên kết tĩnh thông thường, ví dụ như -lfoo
libfoo.dylib. Chúng có thể được tạo bằng cách chuyển -dynamiclib
cờ đến trình biên dịch. ( -fPIC
là mặc định và không cần phải được chỉ định.)
Các mô-đun có thể tải được gọi là "gói" trong Mach-O speak. Họ có loại tập tin MH_BUNDLE
. Họ có thể mang theo bất kỳ phần mở rộng nào; Phần mở rộng .bundle
được Apple khuyến nghị, nhưng hầu hết các phần mềm được chuyển đều sử dụng .so
vì mục đích tương thích. Thông thường, bạn sẽ sử dụng các gói cho các plugin mở rộng ứng dụng; trong các tình huống như vậy, gói sẽ liên kết với tệp nhị phân của ứng dụng để có quyền truy cập vào API đã xuất của ứng dụng. Chúng có thể được tạo bằng cách chuyển -bundle
cờ đến trình biên dịch.
Cả hai dylibs và bó có thể được tự động nạp bằng cách sử dụng dl
API (ví dụ dlopen
, dlclose
). Không thể liên kết với các gói như thể chúng là các thư viện được chia sẻ. Tuy nhiên, có thể một gói được liên kết với các thư viện chia sẻ thực sự; những cái đó sẽ được tải tự động khi gói được tải.
Trong lịch sử, sự khác biệt có ý nghĩa hơn. Trong Mac OS X 10.0, không có cách nào để tải động các thư viện. Một bộ API dyld (ví dụ NSCreateObjectFileImageFromFile
, NSLinkModule
) đã được giới thiệu với 10.1 để tải và dỡ các gói, nhưng chúng không hoạt động đối với các dylib. Một dlopen
thư viện tương thích làm việc với các gói đã được thêm vào trong 10.3; trong 10,4, dlopen
đã được viết lại để trở thành một phần nguyên gốc của dyld và thêm hỗ trợ cho việc tải (nhưng không tải) dylibs. Cuối cùng, 10,5 đã thêm hỗ trợ cho việc sử dụng dlclose
với dylib và không dùng API dyld.
Trên các hệ thống ELF như Linux, cả hai đều sử dụng cùng một định dạng tệp ; bất kỳ đoạn mã được chia sẻ nào cũng có thể được sử dụng làm thư viện và để tải động.
Cuối cùng, hãy lưu ý rằng trong Mac OS X, "gói" cũng có thể tham chiếu đến các thư mục có cấu trúc được tiêu chuẩn hóa chứa mã thực thi và các tài nguyên được sử dụng bởi mã đó. Có một số sự chồng chéo về mặt khái niệm (đặc biệt với "các gói có thể tải" như các plugin, thường chứa mã thực thi dưới dạng gói Mach-O), nhưng chúng không nên bị nhầm lẫn với các gói Mach-O đã thảo luận ở trên.
Tham khảo thêm: