Gentoo Logo

Aviso : Este documento não é válido e não é mais mantido.


Guia de Prelink do Gentoo Linux

Conteúdo:

1.  Introdução

O que é o Prelink e como ele pode ajudar-me?

A maior parte das aplicações usa bibliotecas compartilhadas. As bibliotecas compartilhadas precisam ser carregadas na memória na hora de serem rodadas e as várias referências simbólicas precisam ser resolvidas. Para a maior parte dos programas pequenos a referência simbólica é muito rápida, mas para programas escritos em C++ que têm muitas dependências de bibliotecas, a ligação simbólica pode levar um bom tempo.

Na maior parte dos sistemas, as bibliotecas não são alteradas com freqüência e quando um programa é rodado, as operações levadas para ligar o programa são as mesmas toda vez. O Prelink tira proveito disso carregando a ligação e gravando-a dentro do executável, com efeito de pré-ligá-lo.

O pré-ligamento pode diminuir o tempo de início das aplicações. Por exemplo, o tempo de carregamento de um programa típico do KDE pode ser diminuído em até 50%. A única manutenção necessária é rodar o prelink cada vez que uma biblioteca for atualizada para um executável pré-ligado.

Resumo

  • A pré-ligação é feita através de um programa chamado, surpreendentemente, prelink. Ele muda o binário para fazê-lo iniciar mais rápido.
  • Se as bibliotecas de que uma aplicação dependem mudarem depois de você pré-ligá-las, você precisa re-pré-ligar a aplicação, caso contrário você perderá a vantagem da velocidade. Isto quer dizer, cada vez que você atualizar um pacote via portage que atualiza bibliotecas, elas precisam ser re-pré-ligadas.
  • A mudança no binário é totalmente reversível. O prelink tem uma função desfazer.
  • Novas versões do Portage podem lidar, via prelink, com as mudanças de MD5sums e mtimes dos binários.
  • Você não precisa configurar FEATURES="prelink" em seu arquivo make.conf; O Portage irá suportar pré-ligação automaticamente se puder encontrar o binário pré-ligado.

2.  Configurando o Prelink

Instalando os programas

Primeiro você precisa instalar a ferramenta prelink. O processo de emerge faz a verificação automática de que seu sistema pode fazer pré-ligação seguramente.

Listagem de código 2.1: Instalando o Prelink

# emerge prelink

Várias pessoas obtêm errors na instalação do prelink porque testes falham. Os testes foram colocados por motivos de segurança, o comportamento do prelink não é definido se você desativá-los. Os errors de instalação normalmente só dependem dos pacotes centrais; binutils, gcc, e glibc. Tente re-instalar os pacotes nessa ordem.

Nota: Dica: Se você tiver um erro tente compilar e testar o prelink você mesmo (./configure ; make ; make check ). Em um erro você pode ver os arquivos de *.log no diretório de testes. Eles podem dar algumas dicas úteis.

Se você tiver um conjunto de passos que reproduz o erro de instalação em outro sistema por favor mande um e-mail deles para Stefan Jones.

Preparando seu sistema

A seguir você deve ativar a variável de USE "pic" em seu /etc/make.conf Não se esqueça de rodar emerge --update --deep --newuse world para que a mudança de variável de USE seja incorporada em seu sistema.

Também certifique-se de que você não tem -fPIC configurado em suas CFLAGS/CXXFLAGS. Se você tiver, você pode ter que reconstruir todo o seu sistema sem a opção.

Configuração

Rodar env-update irá gerar o arquivo /etc/prelink.conf que diz ao prelink que arquivos pré-ligar.

Listagem de código 2.2: Rodando env-update

# env-update

Infelizmente você não pode pré-ligar arquivos que foram compilados com versões antigas do binutils. Muitas das aplicações vem de pacotes pré-compilados, só de binários que são instalados em /opt. Fazer o seguinte arquivo irá avisar o prelink para não tentar pré-ligá-los.

Listagem de código 2.3: /etc/env.d/60prelink

PRELINK_PATH_MASK="/opt"

Nota: Você pode adicionar mais ou menos diretórios à lista separada por dois pontos.

3.  Pré-ligando

Uso do Prelink

Eu uso o seguinte comando para pré-ligar todos binários nos diretórios dados por /etc/prelink.conf.

Listagem de código 3.1: Pré-ligando arquivos listados

# prelink -amR

Aviso: Foi observado que se você estiver com pouco espaço em disco e você pré-ligar seu sistema inteiro é possível que seus binários sejam trancados. O resultado é um sistema defeitu0so. Use o comando file ou readelf para verificar o estado de um arquivo binário. Alternativamente, verifique a quantidade de espaço livre em disco antes de começar com df -h.

As opções explicadas:
-a "All": pré-ligar todos binários
-m Conservar o espaço de memória virtual. É necessário se você tem muitas bibliotecas que precisam ser pré-ligadas.
-R Random -- usar ordem aleatória de endereços, isto aumenta a segurança contra buffer overflows.

Nota: Para mais opções e detalhes veja man prelink.

Deixando o KDE mais rápido depois da pré-ligação

O tempo de carregamento do KDE pode ser muito diminuído depois da pré-ligação. Se você informar ao KDE que ele foi pré-ligado ele irá desligar o carregamento do kdeinit (já que não é mais necessário) o que deixa o KDE ainda mais rápido.

Configure KDE_IS_PRELINKED="true" em /etc/env.d/99kde-env para informar o KDE sobre a pré-ligação.

4.  Problemas e consertos conhecidos

"Cannot prelink against non-PIC shared library"

A causa deste problema é de bibliotecas compartilhadas mal-compiladas que não foram compiladas com a opção do gcc -fPIC para todos seus arquivos de objeto.

Aqui estão as bibliotecas que não foram arrumadas ou não podem ser arrumadas:

  • As bibliotecas do pacote wine, incluindo o winex. Pré-ligação não melhora executáveis de MS Windows de qualquer jeito.
  • A biblioteca em media-video/mjpegtools, /usr/lib/liblavfile-1.6.so.0.

Se sua biblioteca problemática não foi listado por favor relate-a com, preferencialmente, um patch para adicionar o -fPIC às CFLAGS relevantes.

Quando eu pré-ligo meu sistema alguns binários estáticos não funcionam mais

Até onde o glibc sabe, não existe nada como um binário 100% estático. Se você compilar um binário estaticamente com o glibc, ele pode ainda depender de outros arquivos de sistema. Abaixo está uma explicação por Dick Howell,

"Eu suponho que a idéia é que tudo estará no arquivo baixado, então nada depende de bibliotecas locais no sistema alvo. Infelizmente com o Linux, e acho que qualquer outra coisa usando GLIBC, isto ainda não é verdade. Existe o "libnss" (name service swith, que as pessoas parecem chamar de network security system) que fornece funções para acessar vários bancos de dados para autenticação, informações de rede, e outras coisas. Deve fazer programas de aplicações independentes do ambiente de rede real configurado separadamente na máquina. Uma boa idéia, mas mudanças ao GLIBC podem levar a problemas em seu carregamento. E você não pode ligar estaticamente o "libnss", já que ele é configurado para cada máquina individualmente. O problema resume-se, creio eu, principalmente à ligação estática de outras bibliotecas do GLIBC, especialmente "libpthread", "libm", e "libc", a partir das quais vem chamadas de funções incompatíveis com o "libnss"."

O Prelink aborta com "prelink: dso.c:306: fdopen_dso: Assertion `j == k' failed."

Este é um problema conhecido, bondosamente diagnosticado aqui. O Prelink não pode lidar com binários comprimidos com UPX. A partir do prelink-20021213 não existe conserto fora esconder os executáveis enquanto você estiver pré-ligando. Veja a seção de configuração acima para um jeito fácil de fazer isso.

Eu uso o grsecurity e parece que o prelink não funciona.

Para fazer a pré-ligação em um sistema com grsecurity usando uma base mmap() aleatória, é necessário DESLIGAR o "randomized mmap() base" para o /lib/ld-2.3.*.so. Isto pode ser feito com o utilitário chpax, mas deve ser feito quando o arquivo não estiver em uso (por exemplo carregar de um CD de resgate).

5.  Conclusão

O prelink pode reduzir drasticamente a velocidade de início para um grande número de aplicações. Há suporte dentro do Portage. O prelink também é seguro já que você sempre pode desfazê-lo para qualquer binário com que você tenha problemas. Só lembre-se de que quando você atualizar o glibc ou outras bibliotecas contra as quais você pré-ligou, você precisa rodar o prelink de novo! Para resumir, boa sorte!



Imprimir

Atualizado 21 de abril de 2005

A versão original desta tradução não é mais mantida

Resumo: Este guia ensina como usar o suporte de prelink no portage 2.0.46 e mais recente.

Stefan Jones
Autor

John P. Davis
Editor

Jorge Paulo
Editor

Sven Vermeulen
Editor

Erwin
Editor

Marcelo Góes
Tradutor

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.