Pergunta

Em 'C', Linux,

Eu bibliotecas necessidade estáticas para estaticamente ligação, ou os compartilhados que tenho suficiente? Se não, por que não? (Não que eles contêm os mesmos dados?)

Foi útil?

Solução

Sim, você precisa de bibliotecas estáticas para construir um estaticamente ligado executável.

Bibliotecas estáticas são feixes de objetos compilados. Quando você link estaticamente com a biblioteca, é efetivamente o mesmo que tomar os resultados de compilação dessa biblioteca, desembalar-los em seu projeto atual, e usá-los como se fossem seus próprios objetos.

Bibliotecas dinâmicas já estão ligadas. Isto significa que algumas informações como as deslocalizações já foram corrigidos para cima e jogado fora.

Além disso, bibliotecas dinâmicas deve ser compilado como código independente de posição. Esta não é uma restrição sobre bibliotecas estáticas, e resulta em uma diferença significativa no desempenho em algumas plataformas comuns (como x86).

Existem ferramentas como ELF Statifier que tentam agrupar bibliotecas dinamicamente ligados em uma dinamicamente vinculado executável, mas é muito difícil gerar um resultado corretamente-trabalhando em todas as circunstâncias.

Outras dicas

Não existe tal coisa como a compilação estática, apenas a vinculação estática. E para isso, você precisa de bibliotecas estáticas. A diferença entre estático e dinâmico ligar é que com o anterior, os nomes são resolvidos no link-time (logo após tempo de compilação), wheras com o último, eles são resolvidos da mesma maneira que o programa começa a funcionar.

Estática e bibliotecas dinâmicas podem ou não conter a mesma informação, dependendo de muitos fatores. A decisão sobre se a estática ou dinâmica ligar seu código é importante, e muitas vezes vai influenciar arquitetura do aplicativo.

Todas as bibliotecas que apontam em um programa ligado estaticamente deve ser a variante estática. Enquanto a dinâmica (libfoo.so) e estática (libfoo.a) bibliotecas têm as mesmas funções neles, eles são arquivos de formato diferente e por isso você precisa o tipo de correspondência para o seu programa.

Outra opção é Arminho ( http://magicErmine.com ) É como statifier, mas capaz de lidar com a randomização de memória.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top