Como verificar se um arquivo é uma DLL?
Pergunta
Dado um arquivo, quero verificar se é uma DLL, ou um objeto compartilhado (Linux) ou um dylib (Mac OS X), ou algo diferente.Meu principal interesse é diferenciar executável e DLL em Linux e Mac OS X.Para Windows, a extensão deve ser suficiente para o meu problema.
Já verifiquei que a técnica do número mágico não funciona no Linux, pois objetos executáveis e compartilhados possuem o mesmo número.
Solução
O comando Unix (Linux e Mac OS X) file
sabe como identificar tipos de arquivos.
man file
informa sobre as informações 'mágicas' usadas para fazer isso e, em particular, onde o arquivo com essas informações pode ser encontrado.
man 5 magic
descreve o arquivo em detalhes e também deve informar onde ele está.Você pode dar uma olhada lá e extrair tudo o que precisar.E/ou apenas código de berço da fonte de file
.
Atualizar:
Observe que no Linux um arquivo pode ser ambos um executável e uma biblioteca compartilhada ao mesmo tempo.
Um exemplo é /lib/libc.so.6
(uma biblioteca compartilhada que pode ser executada).
Outro exemplo:qualquer executável construído com -pie
flag pode ser usado como uma biblioteca compartilhada.Ver esse responda para obter detalhes.
Outras dicas
Use o file
ferramenta (para Linux e Mac OS).
Escreva um programa, tente carregar a DLL - se tiver sucesso, é uma delas :)
Editar:Ok, isso também pode funcionar para executáveis :-/