O que é o formato de ficheiro DLL?
Arquivos com a extensão .dll contêm bibliotecas vinculadas dinamicamente compartilhadas no Microsoft Windows. O formato .dll utiliza a mesma estrutura binária dos arquivos .exe - o formato Portable Executable (PE), identificado pelos magic bytes MZ no deslocamento 0 e uma assinatura PE\0\0 apontada pelo cabeçalho DOS stub - mas, ao contrário de um executável, uma .dll não pode ser lançada diretamente; ela deve ser carregada por um processo hospedeiro.
Todos os dados em uma .dll podem ser carregados na memória e usados por vários programas simultaneamente. As bibliotecas normalmente contêm controles ActiveX, miniaplicativos do painel de controle, drivers de dispositivo ou recursos de ícones e fontes - embora arquivos que desempenham essas últimas funções geralmente usem extensões diferentes, como .ocx para componentes COM ou .sys para drivers de modo kernel. Elas também são usadas como componentes modulares de aplicativos maiores, fornecendo funções específicas como plugins.
As bibliotecas podem conter:
- Código para subprogramas, funções e plugins
- Dados, incluindo gráficos e tabelas de strings
- Recursos associados, como menus, diálogos e informações de versão
A especificação do formato .dll é a mesma dos arquivos .exe - ambos usam o contêiner PE (ou PE32+ no Windows de 64 bits) - no entanto, a biblioteca não constitui um programa autônomo. Dentro do programa chamador, uma referência a uma biblioteca e seu carregamento podem ser realizados tão tarde quanto o momento em que ela é necessária (carregamento retardado). O modelo .dll suporta arquitetura de aplicação modular, incentiva a reutilização de fragmentos de código e reduz tanto o uso de memória quanto o espaço em disco. Arquivos .dll gerenciados compilados para .NET carregam um cabeçalho CLR ao lado da estrutura PE padrão, contendo bytecode MSIL em vez de código de máquina nativo.
Segurança e proteção
RISCO: HIGHDLLs são código executável e malwares as adoram: DLLs maliciosas rodam dentro de processos legítimos (DLL hijacking/sideloading - plantar uma DLL falsa onde um aplicativo procura primeiro), e sites de download de «corretores de DLL» são um canal clássico de malware e golpes. Regras: nunca baixe DLLs individuais de sites de terceiros; corrija erros de DLL ausente reinstalando o aplicativo, instalando o Visual C++ Redistributable / DirectX runtime oficial ou executando sfc /scannow; verifique a assinatura digital de DLLs desconhecidas (Propriedades → Assinaturas Digitais) e examine-as no VirusTotal. Excluir DLLs aleatórias da System32 quebra o Windows.
Detalhes do formato
em resumoProgramas que abrem arquivos DLL
Detalhes técnicos
especificação profunda| Formato binário | PE (Portable Executable) no Windows de 32 bits; PE32+ no Windows de 64 bits - mesma estrutura de contêiner que .exe |
| Magic bytes | 4D 5A («MZ») no deslocamento 0; «PE\0\0» (50 45 00 00) no deslocamento armazenado no campo e_lfanew (0x3C) do DOS stub |
| Flag de identificação de DLL | O bit IMAGE_FILE_DLL (0x2000) no campo COFF Characteristics distingue uma DLL de um EXE dentro do mesmo contêiner PE |
| Tipo MIME | application/vnd.microsoft.portable-executable |
| Mecanismo de exportação | A Export Directory Table lista funções por nome e/ou número ordinal; os chamadores resolvem endereços de tempo de execução via Export Address Table (EAT) |
| Mecanismo de importação | A Import Directory Table declara as DLLs necessárias e nomes de funções ou ordinais; o carregador do Windows corrige a Import Address Table (IAT) no momento do carregamento |
| Modos de vinculação | Vinculação implícita (tempo de carregamento) via um stub .lib de importação, ou vinculação explícita (tempo de execução) via LoadLibrary() e GetProcAddress() |
| ASLR e relocação | A seção .reloc contém uma tabela de relocação base; o ASLR do Windows randomiza o endereço de carregamento real no tempo de execução, substituindo o ImageBase preferencial no cabeçalho opcional PE |
| Seções comuns | .text (código executável), .data (dados inicializados), .rdata (dados somente leitura e importações), .rsrc (recursos), .reloc (relocações base) |
| Recursos incorporados | A seção .rsrc armazena recursos tipados - RT_ICON, RT_DIALOG, RT_STRING, RT_VERSION, RT_MANIFEST - visualizáveis e editáveis com ferramentas como Resource Hacker |
| Compilações de arquitetura | Cada CPU de destino (x86, x64, ARM, ARM64) requer um binário DLL separado; sem suporte a binários universais (fat-binary), ao contrário do dylib do macOS |
| DLLs .NET gerenciadas | DLLs compiladas por CLR incorporam um IMAGE_COR20_HEADER apontando para bytecode MSIL/CIL em vez de código de máquina nativo; descompiláveis com ILSpy ou dotPeek |
| Side-by-side assemblies | O WinSxS do Windows XP+ permite que várias versões da mesma DLL coexistam em uma máquina, governadas por arquivos de manifesto de aplicativo |
| Ponto de entrada | Função DllMain() opcional chamada pelo carregador em quatro eventos: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_DETACH |
| Carregamento retardado | A opção do vinculador /DELAYLOAD adia o carregamento da DLL até a primeira chamada a uma de suas funções exportadas, reduzindo o tempo de inicialização do processo |
| Lançado | 1985 (Windows 1.0, NE format); current PE format since Windows NT 3.1, 1993 |
| Padrão aberto | Sim · livre de royalties |
| Especificação | learn.microsoft.com |