Red Hat Training
A Red Hat training course is available for RHEL 8
3.6. Usando tanto bibliotecas estáticas como dinâmicas com GCC
Algumas vezes é necessário ligar algumas bibliotecas de forma estática e outras dinamicamente. Esta situação traz alguns desafios.
Pré-requisitos
Introdução
gcc reconhece tanto as bibliotecas dinâmicas quanto as estáticas. Quando a -lfoo
se encontrar a opção gcc primeiro tentará localizar um objeto compartilhado (um arquivo .so
) contendo uma versão dinamicamente ligada da biblioteca foo, e depois procurará o arquivo (.a
) contendo uma versão estática da biblioteca. Assim, as seguintes situações podem resultar desta busca:
- Somente o objeto compartilhado é encontrado, e gcc se conecta dinamicamente com ele.
- Somente o arquivo é encontrado, e gcc links contra ele de forma estática.
- Tanto o objeto compartilhado quanto o arquivo são encontrados e, por padrão, gcc seleciona a ligação dinâmica contra o objeto compartilhado.
- Não é encontrado objeto compartilhado nem arquivo, e a ligação falha.
Devido a estas regras, a melhor maneira de selecionar a versão estática ou dinâmica de uma biblioteca para ligação é ter apenas essa versão encontrada por gcc. Isto pode ser controlado até certo ponto usando ou deixando de fora diretórios contendo as versões da biblioteca, ao especificar a -Lpath
opções.
Além disso, como a ligação dinâmica é o padrão, a única situação em que a ligação deve ser explicitamente especificada é quando uma biblioteca com ambas as versões presentes deve ser ligada estaticamente. Há duas resoluções possíveis:
-
Especificando as bibliotecas estáticas por caminho de arquivo em vez da opção
-l
-
Usando a opção
-Wl
para passar opções para o linker
Especificando as bibliotecas estáticas por arquivo
Normalmente, gcc é instruído a criar um link contra a biblioteca foo com o -lfoo
opção. Entretanto, é possível especificar o caminho completo para arquivar libfoo.a
contendo, ao invés disso, a biblioteca:
$ gcc ... caminho/para/libfoo.a ...
A partir da extensão do arquivo .a
, gcc entenderá que se trata de uma biblioteca para se conectar com o programa. No entanto, especificar o caminho completo para o arquivo da biblioteca é um método menos flexível.
Usando a opção -Wl
A opção gcc -Wl
é uma opção especial para passar opções para o linker subjacente. A sintaxe desta opção difere das outras opções gcc. A opção -Wl
é seguida por uma lista separada por vírgula de opções de linker, enquanto outras opções gcc requerem uma lista de opções separada por espaço.
O linker ld usado por gcc oferece as opções -Bstatic
e -Bdynamic
para especificar se as bibliotecas que seguem esta opção devem ser vinculadas de forma estática ou dinâmica, respectivamente. Após passar -Bstatic
e uma biblioteca para o linker, o comportamento padrão de linkamento dinâmico deve ser restaurado manualmente para que as seguintes bibliotecas sejam vinculadas dinamicamente com a opção -Bdynamic
.
Para vincular um programa, ligue a biblioteca first estaticamente (libfirst.a
) e second dinamicamente (libsecond.so
):
$ gcc ... -Wl,-Bstatic -lfirst -Wl,-Bdynamic -lsecond...
gcc pode ser configurado para usar links que não o padrão ld.
Recursos adicionais
- Usando a Coleção de Compiladores GNU (GCC)
- Documentação para binúteis 2.27