Формат об'єктного файлу Mach-O, який використовується Mac OS X для виконуваних файлів і бібліотек, розрізняє спільні бібліотеки та динамічно завантажені модулі . Використовуйте, otool -hv some_file
щоб побачити тип файлу some_file
.
Бібліотеки спільного користування Mach-O мають тип файлу MH_DYLIB
і несуть розширення .dylib. Вони можуть бути пов'язані із звичайними прапорцями статичного лінкера, наприклад, -lfoo
для libfoo.dylib. Їх можна створити, передавши -dynamiclib
прапор компілятору. ( -fPIC
є типовим і не потрібно вказувати.)
Модулі, що завантажуються, називаються "розшаруваннями" в мові Mach-O. Вони мають тип файлу MH_BUNDLE
. Вони можуть нести будь-яке розширення; розширення .bundle
рекомендується компанією Apple, але більшість портативних програм використовується .so
для сумісності. Зазвичай ви будете використовувати пакети для плагінів, які розширюють додаток; у таких ситуаціях пакет буде зв’язуватися з бінарним додатком, щоб отримати доступ до експортованого API програми. Їх можна створити, передавши -bundle
прапор компілятору.
І диліби, і пучки можуть динамічно завантажуватися за допомогою dl
API (наприклад dlopen
, dlclose
). Неможливо зв’язати їх з наборами, як якщо б вони були спільними бібліотеками. Однак можливо, що пакет пов'язаний з реальними спільними бібліотеками; вони завантажуватимуться автоматично, коли пакет буде завантажений.
Історично розбіжності були більш істотними. У Mac OS X 10.0 не було можливості динамічно завантажувати бібліотеки. Набір кольорів API (наприклад NSCreateObjectFileImageFromFile
, NSLinkModule
) було введено з 10.1 для завантаження та вивантаження пакетів, але вони не працювали для дилібів. dlopen
Бібліотеки сумісності , яка працювала з пучками була додана в 10.3; у 10.4, dlopen
було переписано як нативну частину dyld та додано підтримку для завантаження (але не вивантаження) дилібів. Нарешті, 10.5 додала підтримку для використання dlclose
з dylibs та застаріла API dild.
У системах ELF, таких як Linux, обидва використовують однаковий формат файлів ; будь-який фрагмент спільного коду може використовуватися як бібліотека та для динамічного завантаження.
Нарешті, майте на увазі, що в Mac OS X "пакет" також може посилатися на каталоги зі стандартизованою структурою, що містить виконуваний код та ресурси, використовувані цим кодом. Існує певна концептуальна дублювання (зокрема, з "завантажуваними пакетами", такими як плагіни, які, як правило, містять виконуваний код у вигляді пакету Mach-O), але їх не слід плутати з розглянутими вище пакетами Mach-O.
Додаткові посилання: