Format file objek Mach-O yang digunakan oleh Mac OS X untuk executable dan pustaka membedakan antara pustaka bersama dan modul yang dimuat secara dinamis . Gunakan otool -hv some_file
untuk melihat tipe file dari some_file
.
Pustaka bersama Mach-O memiliki tipe file MH_DYLIB
dan membawa ekstensi .dylib. Mereka dapat dihubungkan dengan flag tautan statis biasa, misalnya -lfoo
untuk libfoo.dylib. Mereka dapat dibuat dengan mengirimkan -dynamiclib
bendera ke kompiler. ( -fPIC
adalah default dan tidak perlu ditentukan.)
Modul yang dapat dimuat disebut "bundel" dalam bahasa Mach-O. Mereka memiliki tipe file MH_BUNDLE
. Mereka dapat membawa ekstensi apa pun; ekstensi .bundle
direkomendasikan oleh Apple, tetapi sebagian besar perangkat lunak porting menggunakan .so
demi kompatibilitas. Biasanya, Anda akan menggunakan bundel untuk plug-in yang memperpanjang aplikasi; dalam situasi seperti itu, bundel akan terhubung dengan biner aplikasi untuk mendapatkan akses ke API yang diekspor aplikasi. Mereka dapat dibuat dengan mengirimkan -bundle
bendera ke kompiler.
Baik dylib dan bundel dapat dimuat secara dinamis menggunakan dl
API (mis. dlopen
, dlclose
). Tidak mungkin untuk menautkan ke bundel seolah-olah mereka adalah perpustakaan bersama. Namun, ada kemungkinan bahwa bundel terkait dengan perpustakaan bersama nyata; itu akan dimuat secara otomatis ketika bundel dimuat.
Secara historis, perbedaannya lebih signifikan. Di Mac OS X 10.0, tidak ada cara untuk memuat pustaka secara dinamis. Serangkaian API dyld (misalnya NSCreateObjectFileImageFromFile
, NSLinkModule
) diperkenalkan dengan 10.1 untuk memuat dan membongkar bundel, tetapi mereka tidak bekerja untuk dylibs. Sebuah dlopen
perpustakaan kompatibilitas yang bekerja dengan bundel ditambahkan di 10.3; pada 10.4, dlopen
ditulis ulang menjadi bagian asli dari dyld dan menambahkan dukungan untuk memuat (tetapi tidak menurunkan) dylibs. Akhirnya, 10,5 menambahkan dukungan untuk digunakan dlclose
dengan dylibs dan tidak lagi menggunakan API yang sudah digunakan.
Pada sistem ELF seperti Linux, keduanya menggunakan format file yang sama ; setiap bagian dari kode bersama dapat digunakan sebagai perpustakaan dan untuk pemuatan dinamis.
Akhirnya, ketahuilah bahwa di Mac OS X, "bundle" juga dapat merujuk ke direktori dengan struktur standar yang menyimpan kode yang dapat dieksekusi dan sumber daya yang digunakan oleh kode itu. Ada beberapa tumpang tindih konseptual (terutama dengan "bundel yang dapat dimuat" seperti plugin, yang umumnya berisi kode yang dapat dieksekusi dalam bentuk bundel Mach-O), tetapi mereka tidak harus bingung dengan bundel Mach-O yang dibahas di atas.
Referensi tambahan: