.dllou .sosão bibliotecas compartilhadas (vinculadas em tempo de execução), enquanto .ae .libé uma biblioteca estática (vinculada em tempo de compilação). Isso não faz diferença entre Windows e Linux.
A diferença é como eles são tratados. Nota: a diferença está apenas nos costumes, como eles são usados. Não seria muito difícil criar o Linux no modo Windows e vice-versa, exceto que praticamente ninguém faz isso.
Se usarmos uma dll ou chamarmos uma função mesmo de nosso próprio binário, haverá uma maneira simples e clara. Por exemplo, em C, vemos que:
int example(int x) {
...do_something...
}
int ret = example(42);
No entanto, no nível ASM, pode haver muitas diferenças. Por exemplo, em x86, um callcódigo de operação é executado e o 42dado na pilha. Ou em alguns registros. Ou em qualquer lugar. Ninguém sabe que antes de escrever a dll , como ela será usada. Ou como os projetos vão querer usá-lo, possivelmente escrito com um compilador (ou em um idioma!) Que nem existe agora (ou é desconhecido para os desenvolvedores da dll).
Por exemplo, por padrão, C e Pascal colocam os argumentos (e obtêm os valores de retorno) da pilha - mas eles estão fazendo isso em ordem diferente . Você também pode trocar argumentos entre suas funções nos registradores por alguma otimização - dependente do compilador -.
Como você vê corretamente, o costume do Windows é criar uma dll, também criamos um mínimo .a/ .libcom ela. Essa biblioteca estática mínima é apenas um invólucro, os símbolos (funções) dessa dll são alcançados através dela. Isso faz as conversões de chamada no nível asm necessárias.
Sua vantagem é a compatibilidade. Sua desvantagem é que, se você tiver apenas uma .dll, poderá ter dificuldade em descobrir como é que suas funções serão chamadas. Isso torna o uso de dlls uma tarefa de hacking, se o desenvolvedor da dll não fornecer a você.a . Assim, ele serve principalmente para fins de fechamento, por exemplo, portanto é mais fácil obter dinheiro extra para os SDKs.
Outra desvantagem é que, mesmo que você use uma biblioteca dinâmica, é necessário compilar esse pequeno invólucro estaticamente.
No Linux, a interface binária das DLLs é padrão e segue a convenção C. Portanto, não .aé necessário e há compatibilidade binária entre as bibliotecas compartilhadas; em troca, não temos as vantagens do costume da microsoft.