O formato de arquivo de objeto Mach-O usado pelo Mac OS X para executáveis e bibliotecas distingue entre bibliotecas compartilhadas e módulos carregados dinamicamente . Use otool -hv some_file
para ver o tipo de arquivo de some_file
.
As bibliotecas compartilhadas do Mach-O têm o tipo de arquivo MH_DYLIB
e carregam a extensão .dylib. Eles podem ser vinculados aos sinalizadores estáticos comuns do vinculador, por exemplo, -lfoo
para libfoo.dylib. Eles podem ser criados passando o -dynamiclib
sinalizador para o compilador. ( -fPIC
é o padrão e não precisa ser especificado.)
Módulos carregáveis são chamados de "pacotes" na fala do Mach-O. Eles têm o tipo de arquivo MH_BUNDLE
. Eles podem carregar qualquer extensão; a extensão .bundle
é recomendada pela Apple, mas a maioria dos softwares portados usa .so
por razões de compatibilidade. Normalmente, você usará pacotes configuráveis para plug-ins que estendem um aplicativo; nessas situações, o pacote será vinculado ao binário do aplicativo para obter acesso à API exportada do aplicativo. Eles podem ser criados passando o -bundle
sinalizador para o compilador.
Dylibs e pacotes configuráveis podem ser carregados dinamicamente usando as dl
APIs (por exemplo dlopen
, dlclose
). Não é possível vincular a pacotes configuráveis como se fossem bibliotecas compartilhadas. No entanto, é possível que um pacote configurável esteja vinculado a bibliotecas compartilhadas reais; esses serão carregados automaticamente quando o pacote configurável for carregado.
Historicamente, as diferenças foram mais significativas. No Mac OS X 10.0, não havia como carregar dinamicamente bibliotecas. Um conjunto de APIs dyld (por exemplo NSCreateObjectFileImageFromFile
, NSLinkModule
) foi introduzido com 10.1 para carregar e descarregar pacotes configuráveis , mas eles não funcionaram para dylibs. Uma dlopen
biblioteca de compatibilidade que funcionou com pacotes configuráveis foi adicionada na 10.3; na dlopen
versão 10.4, foi reescrita para ser uma parte nativa do dyld e adicionou suporte para carregar (mas não descarregar) dylibs. Por fim, o 10.5 adicionou suporte ao uso dlclose
com dylibs e reprovou as APIs do dyld.
Em sistemas ELF como o Linux, ambos usam o mesmo formato de arquivo ; qualquer parte do código compartilhado pode ser usada como uma biblioteca e para carregamento dinâmico.
Por fim, lembre-se de que, no Mac OS X, "pacote" também pode se referir a diretórios com uma estrutura padronizada que contém código executável e os recursos usados por esse código. Há alguma sobreposição conceitual (particularmente com "pacotes configuráveis carregáveis", como plug-ins, que geralmente contêm código executável na forma de um pacote configurável Mach-O), mas eles não devem ser confundidos com os pacotes configuráveis Mach-O discutidos acima.
Referências adicionais: