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