3.5. Usando uma biblioteca dinâmica com GCC
As bibliotecas dinâmicas estão disponíveis como arquivos executáveis independentes, necessários tanto no tempo de ligação como no tempo de execução. Elas permanecem independentes do arquivo executável de sua aplicação.
Pré-requisitos
- O GCC deve ser instalado no sistema.
- Um conjunto de arquivos fonte ou objeto formando um programa válido, exigindo alguma biblioteca dinâmica foo e nenhuma outra biblioteca.
- A biblioteca foo deve estar disponível como um arquivo libfoo.so.
Ligando um programa a uma biblioteca dinâmica
Para vincular um programa a uma biblioteca dinâmica foo:
$ gcc ... -Llibrary_path -lfoo...
Quando um programa é ligado contra uma biblioteca dinâmica, o programa resultante deve sempre carregar a biblioteca em tempo de execução. Há duas opções para a localização da biblioteca:
-
Usando um valor
rpath
armazenado no próprio arquivo executável -
Usando a variável
LD_LIBRARY_PATH
em tempo de execução
Usando um valor armazenado no arquivo executável do rpath
O rpath
é um valor especial salvo como parte de um arquivo executável quando ele está sendo vinculado. Mais tarde, quando o programa for carregado de seu arquivo executável, o linker de tempo de execução usará o valor rpath
para localizar os arquivos da biblioteca.
Ao fazer o link com GCC, para armazenar o caminho library_path como rpath
:
$ gcc ... -Llibrary_path -lfoo -Wl,-rpath=library_path...
O caminho library_path deve apontar para um diretório contendo o arquivo libfoo.so.
Não há espaço após a vírgula na opção -Wl,-rpath=
!
Para executar o programa mais tarde:
$ ./programa
Usando a variável de ambiente LD_LIBRARY_PATH
Se não for encontrado rpath
no arquivo executável do programa, o linker de tempo de execução usará a variável de ambiente LD_LIBRARY_PATH
. O valor desta variável deve ser alterado para cada programa. Este valor deve representar o caminho onde os objetos da biblioteca compartilhada estão localizados.
Para executar o programa sem o conjunto rpath
, com bibliotecas presentes no caminho library_path:
$ export LD_LIBRARY_PATH=library_path:$LD_LIBRARY_PATH
$ ./program
Deixar de fora o valor rpath
oferece flexibilidade, mas requer a definição da variável LD_LIBRARY_PATH
toda vez que o programa for executado.
Colocação da Biblioteca nos Diretórios Padrão
A configuração do linker de tempo de execução especifica uma série de diretórios como localização padrão dos arquivos dinâmicos da biblioteca. Para usar este comportamento padrão, copie sua biblioteca para o diretório apropriado.
Uma descrição completa do comportamento do linker dinâmico está fora do escopo deste documento. Para maiores informações, veja os seguintes recursos:
Páginas de manual do Linux para o linker dinâmico:
$ homem ld.so
Conteúdo do arquivo de configuração
/etc/ld.so.conf
:$ gato /etc/ld.so.conf
Relatório das bibliotecas reconhecidas pelo linker dinâmico sem configuração adicional, que inclui os diretórios:
$ ldconfig -v