domingo, 16 de agosto de 2009

Bibliotecas

- Objetivos
  • Mesmo depois que um programa esteja instalado precisamos ver se as suas bibliotecas foram carregadas;
  • Mostrar como carregá-las;
  • As diferenças entre as bibliotecas;
  • As bibliotecas são utilizadas pelos executaveis do sistemas, sem ela não há execução.

Hoje em dia é muito simples instalar um programa já compilado, com a ajuda de gerenciadores de pacotes como o rpm,dpkg,apt etc. Mas você vai encontrar muitos programas disponiveis somente em código-fonte, e às vezes nem tão bem documentados assim. Entretanto, compilar um programa não é algo de outro mundo, não é um bicho de sete cabeças. A função destas bibliotecas lembra um pouco a dos arquivo .dll do Windows. Temos bibliotecas estáticas e compartilhadas. As dinámicas são usadas por vários programas e necessárias para instalar programas distribuidos em código fonte (os famosos arquivos tar.gz). O modo estático é ligeiramente mais rápido, pois não precisa buscar bibliotecas em diretórios, mas consome mais espaço (dado que cada programa teria uma cópia da biblioteca dentro de si).

Prática dirigida

1- Utilizando o comando ldd:

# aptitude install xmms

# ldd /usr/bin/xmms

Neste exemplo, todas as bibliotecas foram encontradas e carregadas e se encontram listadas ao lado direito. Para instalar uma biblioteca necessária ausente, devemos copia-lá em um dos diretórios listados no arquivo /etc/ld.so.conf e em seguida executar o comando ldconfig.

2 - Agora, para vermos a importância disso, vamos fazer uma simulação, vamos esconder uma biblioteca da aplicação xmms (player de musica). Então, mudando o nome da biblioteca:

# mv /usr/lib/libxmms.so.1 /usr/lib/teste

3 - Agora, vamos tentar rodar a aplicação.

# xmms

xmms: error while loading shared libraries: libxms.so.1:
connot open shared object file: No such file or directory

Ele não está conseguindo detectar libxmms.so.1, pois fizemos a simulação de alterar o nome dela.

4 - Vamos chegar as bibliotecas que faltam:

# ldd /usr/bin/xmms

5 - Vamos consertar isso:

# mv /usr/lib/teste /usr/lib/libxmms.so.1

assim colocamos o nome original da biblioteca.

6 - Vamos checar se a biblioteca está sendo detectada novamente:

# ldd /usr/bin/xmms

7 - O arquivo /etc/ld.so.conf contém os diretórios onde procurar dependências:

# cat /etc/ld.so.conf

obs: /lib e /usr/lib já estão automaticamente inclusas!

8 - Existem também a variavel de ambiente LD_LIBRARY_PATH, que instrui o carregador dinâmico para checar um certo diretório:

# export LD_LIBRARY_PATH=/usr/lib/velho:/opt/lib/novo

9 - Temos também outro arquivo, o /etc/ld.so.cache, que contém uma lista de todas as bibliotecas compartilhadas que ld.so ou ld-linux.so irão procurar na máquina. Esse arquivo é sempre gerado e atualizado por ldconfig baseando-se no arquivo /etc/ld.so.conf:

# cat /etc/ld.so.cache

DICA LPI: Se apagarmos o arquivo /etc/ld.so.cache, é só executar o comando: ldconfig

Exercicios teóricos

1- Quais são as diferenças entre o modo estático e o compartilhado? defina os dois.

2 - Em qual diretório onde estão localizadas as bibliotecas do sistema?

3 - Qual é o arquivo que guarda onde podemos encontrar as dependências?

4 - Como eu faço para checar uma biblioteca que está faltando?

DICA LPI: Se apagarmos o arquivo /etc/ld.so.cache, é só executar o comando:ldconfig.

Opcionalmente, podemos editar o arquivo e colocar outros diretórios para o ldconfig procurar as bibliotecas, e depois reexecutá-lo. Para verificar todas as bibliotecas presentes em nossa máquina usamos o ldconfig -p.

0 comentários:

Postar um comentário