Aviso :
Este documento não é válido e não é mais mantido.
|
Guia de Prelink do Gentoo Linux
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!
O conteúdo deste documento está licenciado pela licença Creative Commons -
Attribution / Share Alike.
|