Формат объектного файла 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
. Они могут нести любое расширение; Apple рекомендует расширение .bundle
, но большинство портированных программ использует .so
для совместимости. Как правило, вы будете использовать пакеты для плагинов , которые расширяют приложение; в таких ситуациях пакет будет связываться с двоичным файлом приложения, чтобы получить доступ к экспортированному API приложения. Их можно создать, передав флаг -bundle
компилятору.
Как библиотеки, так и пакеты могут быть динамически загружены с помощью API dl
(например, dlopen
, dlclose
). Невозможно связать пакеты, как если бы они были общими библиотеками. Однако, возможно, что пакет связан с реальными общими библиотеками; они будут загружены автоматически при загрузке пакета.
Исторически различия были более значительными. В Mac OS X 10.0 не было возможности динамически загружать библиотеки. Набор API для dyld (например, NSCreateObjectFileImageFromFile
, NSLinkModule
) был представлен в версии 10.1 для загрузки и выгрузки пакетов, но они не работали для dylibs. Библиотека совместимости dlopen
, которая работала со связками, была добавлена в 10.3; в 10.4 dlopen
был переписан, чтобы быть нативной частью dyld, и добавил поддержку для загрузки (но не выгрузки) dylibs. Наконец, в 10.5 добавлена поддержка использования dlclose
с dylibs и устаревшие API-интерфейсы dyld.
В системах ELF, таких как Linux, обе используют один и тот же формат файла ; любой фрагмент общего кода можно использовать как библиотеку и для динамической загрузки.
Наконец, имейте в виду, что в Mac OS X «bundle» может также обращаться к каталогам со стандартизованной структурой, которая содержит исполняемый код и ресурсы, используемые этим кодом. Существует некоторое концептуальное совпадение (особенно с «загружаемыми пакетами», такими как плагины, которые обычно содержат исполняемый код в форме пакета Mach-O), но их не следует путать с пакетами Mach-O, описанными выше.
Дополнительные ссылки: