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.

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...
Nota

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