Ligador dinâmico

Em computação , um vinculador dinâmico é a parte de um sistema operacional que carrega e vincula as bibliotecas compartilhadas necessárias para um executável quando ele é executado (em " tempo de execução "), copiando o conteúdo das bibliotecas do armazenamento persistente para a RAM , preenchendo tabelas de salto e realocando ponteiros . O sistema operacional específico e o formato executável determinam como o vinculador dinâmico funciona e como ele é implementado.

A vinculação é frequentemente referida como um processo que é realizado quando o executável é compilado , enquanto um vinculador dinâmico é uma parte especial de um sistema operacional que carrega bibliotecas compartilhadas externas em um processo em execução e, em seguida, vincula essas bibliotecas compartilhadas dinamicamente ao processo em execução. Essa abordagem também é chamada de vinculação dinâmica ou vinculação tardia .

Implementações

Microsoft Windows

Biblioteca de vínculo dinâmico , ou DLL, é a implementação da Microsoft do conceito de biblioteca compartilhada nos sistemas operacionais Microsoft Windows e OS/2 . Essas bibliotecas geralmente têm a extensão de arquivo , (para bibliotecas que contêm controles ActiveX ), ou (para drivers de sistema legados ). Os formatos de arquivo para DLLs são os mesmos dos arquivos EXE do Windows – ou seja, Portable Executable (PE) para Windows de 32 bits e 64 bits , e New Executable (NE) para Windows de 16 bits . Assim como os EXEs, as DLLs podem conter código , dados e recursos , em qualquer combinação. DLLOCXDRV

Arquivos de dados com o mesmo formato de arquivo de uma DLL, mas com extensões de arquivo diferentes e possivelmente contendo apenas seções de recursos, podem ser chamados de DLLs de recursos. Exemplos de tais DLLs incluem bibliotecas de interface de usuário multilíngue com extensão MUI, bibliotecas de ícones , às vezes tendo a extensão ICL, e arquivos de fonte , tendo as extensões FONe FOT. [1]

Sistemas do tipo Unix usando ELF e sistemas baseados em Darwin

Na maioria dos sistemas do tipo Unix , a maior parte do código de máquina que compõe o vinculador dinâmico é, na verdade, um executável externo que o kernel do sistema operacional carrega e executa primeiro em um espaço de endereço de processo recém-construído como resultado de chamadas execou posix_spawnfunções. No momento do link, o caminho do vinculador dinâmico que deve ser usado é incorporado na imagem executável.

Quando um arquivo executável é carregado, o kernel do sistema operacional lê o caminho do vinculador dinâmico a partir dele e então tenta carregar e executar esse outro binário executável; se essa tentativa falhar porque, por exemplo, não há arquivo com esse caminho, a tentativa de executar o executável original falha. O vinculador dinâmico então carrega a imagem executável inicial e todas as bibliotecas vinculadas dinamicamente das quais ele depende e inicia o executável. Como resultado, o nome do caminho do vinculador dinâmico é parte da interface binária do aplicativo do sistema operacional .

Sistemas usando ELF

Em sistemas do tipo Unix que usam ELF para imagens executáveis ​​e bibliotecas dinâmicas, como Solaris , versões de 64 bits do HP-UX , Linux , FreeBSD , NetBSD , OpenBSD e DragonFly BSD , o caminho do vinculador dinâmico que deve ser usado é incorporado no momento do link na .interpseção do PT_INTERPsegmento do executável. Nesses sistemas, bibliotecas compartilhadas carregadas dinamicamente podem ser identificadas pelo sufixo do nome do arquivo .so(objeto compartilhado).

O vinculador dinâmico pode ser influenciado a modificar seu comportamento durante a execução do programa ou a vinculação do programa, e os exemplos disso podem ser vistos nas páginas do manual do vinculador de tempo de execução para vários sistemas do tipo Unix. [2] [3] [4] [5] [6] Uma modificação típica desse comportamento é o uso de variáveis ​​de ambienteLD_LIBRARY_PATH e , que ajustam o processo de vinculação de tempo de execução procurando por bibliotecas compartilhadas em locais alternativos e forçando o carregamento e a vinculação de bibliotecas que de outra forma não seriam, respectivamente. Um exemplo é o zlibc, [7] também conhecido como , [a] que facilita a descompressão transparente quando usado por meio do hack ; consequentemente, é possível ler dados de arquivo pré-compactados (gzipados) em sistemas BSD e Linux como se os arquivos não estivessem compactados, essencialmente permitindo que um usuário adicione compactação transparente ao sistema de arquivos subjacente, embora com algumas ressalvas. O mecanismo é flexível, permitindo a adaptação trivial do mesmo código para executar processamento adicional ou alternativo de dados durante a leitura do arquivo, antes do fornecimento dos referidos dados ao processo do usuário que os solicitou. [8] [9]LD_PRELOAD uncompress.soLD_PRELOAD

macOS e iOS

No sistema operacional Apple Darwin , e nos sistemas operacionais macOS e iOS construídos sobre ele, o caminho do vinculador dinâmico que deve ser usado é incorporado no momento do link em um dos comandos de carregamento do Mach-O na imagem executável. Nesses sistemas, bibliotecas compartilhadas carregadas dinamicamente podem ser identificadas pelo sufixo do nome do arquivo .dylibou por sua colocação dentro do pacote para uma estrutura.

O vinculador dinâmico não apenas vincula o executável de destino às bibliotecas compartilhadas, mas também coloca funções de código de máquina em pontos de endereço específicos na memória que o executável de destino conhece no momento do link. Quando um executável deseja interagir com o vinculador dinâmico, ele simplesmente executa a chamada específica da máquina ou instrução de salto para um desses pontos de endereço bem conhecidos. Os executáveis ​​nas plataformas macOS e iOS frequentemente interagem com o vinculador dinâmico durante a execução do processo; sabe-se até que um executável pode interagir com o vinculador dinâmico, fazendo com que ele carregue mais bibliotecas e resolva mais símbolos, horas após seu lançamento inicial. O motivo pelo qual um programa macOS ou iOS interage com o vinculador dinâmico com tanta frequência se deve tanto às APIs Cocoa e Cocoa Touch da Apple quanto ao Objective-C , a linguagem na qual elas são implementadas (veja seus artigos principais para mais informações).

O vinculador dinâmico pode ser coagido a modificar parte de seu comportamento; no entanto, diferentemente de outros sistemas operacionais do tipo Unix, essas modificações são dicas que podem ser (e às vezes são) ignoradas pelo vinculador dinâmico. Exemplos disso podem ser vistos na dyldpágina de manual do [10] Uma modificação típica desse comportamento é o uso das variáveis ​​de ambiente DYLD_FRAMEWORK_PATHe DYLD_PRINT_LIBRARIES. A primeira das variáveis ​​mencionadas anteriormente ajusta o caminho de pesquisa dos executáveis ​​para as bibliotecas compartilhadas, enquanto a última exibe os nomes das bibliotecas conforme elas são carregadas e vinculadas.

O vinculador dinâmico macOS da Apple é um projeto de código aberto lançado como parte do Darwin e pode ser encontrado no dyldprojeto de código aberto da Apple. [11]

Sistemas Unix-like baseados em XCOFF

Em sistemas operacionais do tipo Unix que usam XCOFF , como o AIX , bibliotecas compartilhadas carregadas dinamicamente usam o sufixo de nome de arquivo .a.

O vinculador dinâmico pode ser influenciado a modificar seu comportamento durante a execução do programa ou a vinculação do programa. Uma modificação típica desse comportamento é o uso da LIBPATH variável de ambiente . Essa variável ajusta o processo de vinculação em tempo de execução buscando bibliotecas compartilhadas em locais alternativos e forçando o carregamento e a vinculação de bibliotecas que, de outra forma, não seriam, respectivamente.

OS/360 e sucessores

A vinculação dinâmica de programas em linguagem Assembler no IBM OS/360 e seus sucessores é feita tipicamente usando uma instrução de macro LINK contendo uma instrução Supervisor Call que ativa as rotinas do sistema operacional que tornam o módulo de biblioteca a ser vinculado disponível para o programa. Os módulos de biblioteca podem residir em um "STEPLIB" ou "JOBLIB" especificado em cartões de controle e disponível somente para uma execução específica do programa, em uma biblioteca incluída na LINKLIST no PARMLIB (especificado no momento da inicialização do sistema), ou na "área do pacote de links" onde módulos reentrantes específicos são carregados no momento da inicialização do sistema.

Multics

No sistema operacional Multics , todos os arquivos, incluindo executáveis, são segmentos . Uma chamada para uma rotina que não faz parte do segmento atual fará com que o sistema encontre o segmento referenciado, na memória ou no disco, e o adicione ao espaço de endereço do processo em execução. A vinculação dinâmica é o método normal de operação, e a vinculação estática (usando o binder ) é a exceção.

Eficiência

A vinculação dinâmica é geralmente mais lenta (requer mais ciclos de CPU) do que a vinculação durante o tempo de compilação, [12] como é o caso da maioria dos processos executados em tempo de execução. No entanto, a vinculação dinâmica é frequentemente mais eficiente em termos de espaço (no disco e na memória em tempo de execução). Quando uma biblioteca é vinculada estaticamente, cada processo em execução é vinculado com sua própria cópia das funções da biblioteca sendo chamadas. Portanto, se uma biblioteca for chamada muitas vezes por programas diferentes, as mesmas funções naquela biblioteca serão duplicadas em vários lugares na memória do sistema. Usar bibliotecas dinâmicas compartilhadas significa que, em vez de vincular cada arquivo à sua própria cópia de uma biblioteca em tempo de compilação e potencialmente desperdiçar espaço de memória, apenas uma cópia da biblioteca é armazenada na memória por vez, liberando espaço de memória para ser usado em outro lugar. [13] Além disso, na vinculação dinâmica, uma biblioteca só é carregada se estiver realmente sendo usada. [14]

Veja também

Notas

  1. ^ Não deve ser confundida com a biblioteca de compressão zlib .

Referências

  1. ^ Microsoft Corporation. "Criando uma DLL somente de recursos". Biblioteca da Microsoft Developer Network .
  2. ^ ld.so.1(1) : Solaris dynamic linker/loader –  Manual de referência de comandos do usuário do Solaris 11.4
  3. ^ ld-linux.so(8)  –  Manual do Programador Linux – Administração e Comandos Privilegiados
  4. ^ rtld(1) : FreeBSD dynamic linker/loader –  Manual de comandos gerais do FreeBSD
  5. ^ ld.elf_so(1) : NetBSD dynamic linker/loader –  Manual de comandos gerais do NetBSD
  6. ^ ld.so(1) : OpenBSD dynamic linker/loader –  Manual de comandos gerais do OpenBSD
  7. ^ "ZLIBC - Acesso transparente a arquivos compactados". Arquivado do original em 2000-06-04.
  8. ^ "uncompress.so". delorie.com . Recuperado em 2014-07-04 .
  9. ^ "zlibc.conf". delorie.com . Recuperado em 2014-07-04 .
  10. ^ dyld(1) : Darwin/Mac OS X dynamic linker/loader –  Manual de comandos gerais do Darwin e macOS
  11. ^ Apple Inc. "Open Source - Releases". apple.com . Recuperado em 2014-07-04 .
  12. ^ Xuxian, Jiang (2009). "Princípios de sistemas operacionais: vinculação e carregamento" (PDF) . Universidade Estadual da Carolina do Norte . Recuperado em 2020-09-24 .
  13. ^ Jones, M. (2008-08-28). "Anatomia das bibliotecas dinâmicas do Linux". IBM . Recuperado em 2020-09-24 .
  14. ^ Sivilotti, Paul (agosto de 2012). "Dynamic Linking and Loading" (PDF) . Universidade Estadual de Ohio . Recuperado em 2020-09-24 .

Leitura adicional

  • Levine, John R. (2000) [outubro de 1999]. Linkers e carregadores. The Morgan Kaufmann Series in Software Engineering and Programming (1 ed.). São Francisco, EUA: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC  42413382. Arquivado do original em 2012-12-05 . Recuperado em 2020-01-12 .Código: [1][2] Errata: [3]
  • Ligação e Carregamento Dinâmico, IECC.com
  • Linking dinâmico no Linux e Windows, parte um, Symantec.com
  • Anatomia das bibliotecas dinâmicas do Linux, IBM.com
Obtido em "https://pt.wikipedia.org/w/index.php?title=Linker_dinâmico&oldid=1264800137"