Gentoo Logo

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 deste documento foi atualizada em 2 de abril de 2007

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.

Support OSL

Support OSL

Gentoo Centric Hosting: vr.org

VR Hosted

Tek Alchemy

Tek Alchemy

SevenL.net

SevenL.net

Global Netoptex Inc.

Global Netoptex Inc.

Linux World Expo

Linux World Expo

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