Pesquisa de site

Como usar o comando ldd no Linux com exemplos


Se você estiver usando uma máquina Linux, você lidará constantemente com arquivos executáveis – seja na GUI ou no seu terminal. Os executáveis são compostos de bibliotecas compartilhadas e são usadas e reutilizadas em programas.

Os usuários do Windows podem reconhecer que os arquivos DDL em suas máquinas são bibliotecas compartilhadas. No entanto, esses arquivos são armazenados no Linux com as extensões .o e .so.

Neste breve guia, discutimos como você pode usar o utilitário ldd na linha de comando do Linux para visualizar os objetos e dependências compartilhados de um executável. Mas primeiro, vamos entender o que é um arquivo objeto compartilhado.

O que é um arquivo de objeto compartilhado?

Como você deve imaginar, um arquivo de extensão .so denota um arquivo de objeto compartilhado. Esses arquivos contêm bibliotecas que se vinculam automaticamente aos programas associados quando são executados. No entanto, eles não fazem parte dos executáveis do programa e existem como arquivos independentes.

Eles podem ser carregados em qualquer lugar da memória. O mais interessante é que os arquivos .so contêm informações que mais de um único programa pode usar para descarregar recursos. Em outras palavras, qualquer programa que chame um arquivo objeto compartilhado não precisa fornecer todas as ferramentas necessárias.

Um arquivo .so pode conter funções que instruem o computador a pesquisar todos os seus arquivos e também conter funções que executam cálculos complexos. Muitos programas podem chamar esse mesmo arquivo .so e usar as funções necessárias.

Além do mais, os arquivos .so podem ser atualizados ou substituídos sem que os programas que os utilizam exijam alterações em seu código. Você pode pensar em um arquivo objeto compartilhado como pedaços de código que vários programas podem usar. Esses arquivos otimizam o tamanho dos programas, o que também garante sua eficiência.

O que é o comando ldd?

O comando ldd tem um único objetivo – imprimir as bibliotecas compartilhadas que um programa requer. Você também pode imprimir a biblioteca compartilhada especificada na linha de comando.

Discutimos arquivos de objetos compartilhados, mas não bibliotecas. Uma biblioteca é uma coleção de recursos pré-compilados, como classes, valores, sub-rotinas e funções. Todos esses recursos são usados para criar uma biblioteca.

As bibliotecas são de dois tipos: estáticas e dinâmicas. O Linux normalmente armazena arquivos de biblioteca nos diretórios /lib ou /usr/lib.

Como instalar o comando ldd

Praticamente todas as distribuições Linux vêm com o comando ldd instalado por padrão. Porém, se não estiver disponível em sua máquina, execute o seguinte comando:

sudo apt-get install libc-bin

A instalação levará alguns segundos.

Sintaxe do comando ldd

A melhor coisa sobre o uso do ldd é que sua sintaxe é direta:

ldd [options] executable

A execução do comando exibe as dependências de objetos compartilhados por padrão. Digamos que você queira visualizar as dependências da biblioteca compartilhada binária bash. Para fazer isso, você poderia executar o comando:

sudo ldd /bin/bash

A primeira parte da saída mostrará o objeto compartilhado dinâmico virtual. Na segunda linha, você verá o caminho do interpretador ELF que está codificado no executável. Na seção final, você encontrará os detalhes da memória onde a biblioteca está carregada.

Segurança do comando ldd

Quando o comando ldd é usado, ele normalmente invoca o vinculador dinâmico padrão. A variável de ambiente LD_TRACE_LOADED_OBJECTS é definida como 1, fazendo com que o vinculador exiba as dependências, realizando o que o ldd deveria fazer.

No entanto, em algumas versões do comando e em algumas circunstâncias, o ldd pode recorrer à obtenção de informações executando o programa diretamente. Por esse motivo, é extremamente inseguro executar o ldd em um executável no qual você não confia.

Há uma chance de que o programa execute algum código arbitrário que possa levar a uma violação em sua máquina.

Se você não tiver outra escolha a não ser executar um executável não confiável, é muito mais seguro executar o seguinte:

objdump -p /path/to/program | grep NEEDED

Opções de ldd 

Como em qualquer outro comando, usar opções com ldd modifica seu comportamento. Para usar o ldd para gerar informações adicionais sobre as dependências, como os dados de controle de versão do símbolo, você pode usar a opção -v.

Por outro lado, você pode usar a opção -u para fazer o comando gerar dependências diretas.

O comando ldd suporta mais duas opções: as opções -d e -r. Ambos os comandos executam realocações de dados; no entanto, este último pode realocar objetos e funções. Se houver algum objeto ELF ausente, ambos os comandos irão reportá-los a você.

É importante observar que o comando ldd não funciona com executáveis não dinâmicos. Se você tentar executar o comando com um, verá um erro “não é um executável dinâmico”.

Além disso, o comando não funciona com bibliotecas compartilhadas a.out. Se você quiser mais detalhes sobre o ldd, pode consultar sua página de manual.

Artigos relacionados: