Формат об'єктного файлу 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прапор компілятору.
І диліби, і пучки можуть динамічно завантажуватися за допомогою dlAPI (наприклад 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.
Додаткові посилання: