Red Hat Training

A Red Hat training course is available for RHEL 8

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.

Cuidado

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