Existem 2 argumentos para ter bibliotecas compartilhadas:
- Ajuda a reduzir o espaço em disco.
- Quando uma biblioteca compartilhada é atualizada, todos os binários, dependendo dela, recebem a atualização.
Existe principalmente uma desvantagem para bibliotecas compartilhadas:
- Eles (podem) introduzir o inferno da dependência.
Em computadores de mesa, a primeira vantagem não é mais válida. A perda de espaço em disco não é um problema nos dias de hoje.
Ter binários estáticos nos permitiria obter melhores gerenciadores de pacotes - quero dizer, o inferno da dependência seria uma coisa do passado. Adicionar um programa seria apenas adicionar um binário; eventualmente uma pasta para permitir que ele lide com seus arquivos. Excluir um programa seria simplesmente excluir este arquivo. Dependências? Se foi.
A segunda vantagem ainda permanece, mas acho que a vantagem dos binários estáticos em computadores desktop a supera. Quero dizer, mesmo novas linguagens como Go compilam todos os seus binários, apesar das vantagens das bibliotecas compartilhadas, devido à conveniência.
Como uma das principais vantagens das bibliotecas compartilhadas não é mais um grande problema, as bibliotecas estáticas C ainda são desaprovadas? Se sim, por quê?
Respostas:
A premissa da sua pergunta é falha. O que é desaprovado é aderir a doutrinários e absolutos sem entender a base por trás deles (Programação de Cult de Carga?).
A resposta do SO vinculada é um estudo interessante nesse mesmo tópico - a pergunta era sobre por que uma opção compilar com - estática não estava funcionando, a resposta à qual você vinculou nada mais era do que um discurso retórico sobre não usar vinculação estática. Se não discute por que está ruim, e exige que o OP use a vinculação dinâmica. É lamentável que esteja marcada como a resposta correta (a resposta a seguir tem o dobro de votos e a resposta correta à pergunta do OP) porque, embora a resposta correta esteja lá, ela está profundamente escondida entre uma opinião dogmática.
A verdadeira questão é quais são os prós e os contras da vinculação estática versus dinâmica e quando um seria preferido em relação ao outro.
fonte
Do ponto de vista do desenvolvedor, o vínculo dinâmico geralmente pode acelerar consideravelmente o loop de compilação / link / teste.
Do ponto de vista do gerenciamento de pacotes, considere a libGL, por exemplo. Eu tenho aproximadamente uma dúzia de implementações diferentes disponíveis no meu gerenciador de pacotes, algumas genéricas e outras direcionadas para placas gráficas específicas. Se não estivesse vinculado dinamicamente, haveria uma dúzia de versões de cada programa vinculado ao libGL, ou então seria necessário criar uma camada adicional de abstração que não seja tão eficiente quanto uma chamada de função.
Pense em um problema de segurança em uma biblioteca popular como o Qt. Com o vínculo dinâmico, posso apenas atualizar esse pacote, em vez de precisar identificar, recompilar e implantar todos os pacotes vinculados no Qt.
O link estático pode ter vantagens em aplicativos de código fechado implantados independentemente, mas no gerenciamento de pacotes de código aberto isso prejudica mais do que ajuda.
fonte
Bibliotecas compartilhadas são fortemente preferidas pelos mantenedores de distribuição do Linux, basicamente pelo seu motivo nº 2. É realmente importante para eles que, por exemplo, quando alguém encontra um bug de segurança no zlib , ele não precisa recompilar todos os programas que usam o zlib - isso não apenas lhes custaria mais ciclos de CPU para fazer o recompilando, todo mundo que usa a distribuição precisa baixar novamente todos esses programas. Enquanto isso, dentro do conjunto de pacotes fornecidos por uma distribuição, o inferno das dependências não é um problema, porque tudo é testado para funcionar com esse conjunto de bibliotecas.
Se você estiver criando software de terceiros que precisa de bibliotecas que não estão na sua distribuição, vincular estaticamente essas bibliotecas pode ser menos incômodo do que a alternativa, e isso é bom.
A outra coisa importante a saber é que o GNU
libc
e o GCClibstdc++
possuem componentes que não funcionam de maneira confiável se a biblioteca estiver vinculada estaticamente. O problema mais comum é comdlopen
, porque qualquer módulo com o qual você carregadlopen
é vinculado dinamicamentelibc.so.6
. Portanto, isso significa que agora você tem duas cópias da biblioteca C em seu espaço de endereço, e a hilaridade ocorre quando eles não concordam com qual cópia damalloc
estrutura de dados interna (por exemplo) é autoritativa. Fica pior: várias funções que parecem não ter nada a ver comdlopen
, comogethostbyname
eiconv
usamdlopen
internamente (para que seu comportamento seja configurável em tempo de execução). Felizmente, a ABI para libc e libstdc ++ é muito estável, portanto, é improvável que você encontre problemas vinculando-os dinamicamente.fonte
Eu concordo com o último ponto de mattnz: esta questão é uma pergunta carregada. Ele pressupõe que a vinculação estática seja ruim. Posso pensar em duas razões pelas quais esse não é o caso:
A vinculação estática é segura: se uma biblioteca compartilhada for atualizada de forma que um aplicativo use a nova (talvez a nova substitua a antiga ou a antiga seja removida), isso poderá gerar riscos de que a nova versão interrompa o aplicativo. Esta é uma alteração de código fora do escopo de uma atualização oficial para o aplicativo. Pode não ter sido testado. A vinculação estática evita isso, não compartilhando bibliotecas externamente. Considero que isso é uma desvantagem para as bibliotecas compartilhadas devido a esse risco. E se uma nova versão de uma biblioteca compartilhada introduzir um novo bug que quebre alguns aplicativos mais antigos?
A vinculação estática garante que um aplicativo seja mais independente. Embora as bibliotecas compartilhadas possam ser colocadas com o executável principal, geralmente elas são depositadas em locais compartilhados. Aplicativos vinculados estaticamente são mais fáceis de garantir "portáteis" no sentido de "não exigir alterações em arquivos, diretórios ou configurações pertencentes ao sistema operacional" (pense no diretório, registro do Windows, / etc).
fonte
Cada uma das bibliotecas estáticas e dinâmicas possui seus próprios usos. Olhando para um único aplicativo no escopo, temos uma idéia diferente sobre o que é necessário e o que não é.
A vinculação estática simplifica drasticamente a implantação do aplicativo. Não é necessário detectar e lidar com versões diferentes. Basta assar e implantar.
A vantagem óbvia das bibliotecas dinâmicas é a capacidade de aplicar atualizações independentemente.
Essa é uma das razões pelas quais detesto o maven e outros construtores de projetos de vinculação dinâmica semelhantes para java. Eles esperam que uma única versão da biblioteca esteja disponível em um determinado URL para todo o sempre. Não entendo o problema que ocorre em 10 anos, quando ninguém pode compilar o aplicativo porque toda a origem e os jarros se foram.
fonte
FooLib1.8
não possam incluir o código dessa biblioteca em seu pacote executável de maneira padrão, para permitir que um utilitário de atualização enviado oFooLib1.9
atualize ou faça o downgrade? A maneira como o código era armazenado no Classic Macintosh tornaria isso muito fácil; existe alguma razão para os sistemas atuais não conseguirem fazer isso ainda melhor?