8.83. Despojando

Esta seção é opcional. Se o(a) pretenso(a) usuário(a) não for um(a) programador(a) e não planeja fazer qualquer depuração do software do sistema, [então] o tamanho do sistema pode ser reduzido em cerca de 2 GB removendo-se os símbolos de depuração, e algumas entradas desnecessárias da tabela de símbolo, de binários e de bibliotecas. Isso não causa nenhum inconveniente real para um(a) usuário(a) típico(a) do Linux.

A maioria das pessoas que usa os comandos mencionados abaixo não experiencia quaisquer dificuldades. Entretanto, é fácil cometer um erro e tornar o novo sistema inutilizável. Portanto, antes de executar os comandos strip, é uma boa ideia produzir uma cópia de segurança do sistema LFS no estado atual dele.

Um comando strip com a opção --strip-unneeded remove todos os símbolos de depuração de um binário ou biblioteca. Ele também remove todas as entradas da tabela de símbolos normalmente não necessárias para o lincador (para bibliotecas estáticas) ou lincador dinâmico (para binários lincados dinamicamente e bibliotecas compartilhadas). Usar --strip-debug não remove entradas da tabela de símbolos que podem ser necessárias para alguns aplicativos. A diferença entre unneeded e debug é muito pequena. Por exemplo, uma libc.a não despojada tem 22,4 MB. Depois de despojada com --strip-debug, ela tem 5,9 MB. Usar --strip-unneeded somente reduz o tamanho para 5,8 MB.

Os símbolos de depuração oriundos de bibliotecas selecionadas são comprimidos com Zstd e preservados em arquivos separados. Essa informação de depuração é necessária para se executar testes de regressão com valgrind ou gdb posteriormente, no BLFS.

Observe que o strip sobrescreverá o binário ou arquivo de biblioteca que ele estiver processando. Isso pode quebrar os processos usando código ou dados oriundos do arquivo. Se o processo executando o strip for afetado, [então] o binário ou biblioteca sendo despojado pode ser destruído; isso pode tornar o sistema completamente inutilizável. Para evitar esse problema, nós copiamos algumas bibliotecas e binários para /tmp, despojamos elas lá e as reinstalamos com o comando install. (A entrada relacionada em Seção 8.2.1, “Problemas de Atualização” dá a justificativa para usar o comando install aqui).

[Nota]

Nota

O nome do carregador de "ELF" é "ld-linux-x86-64.so.2" em sistemas de 64 bits e "ld-linux.so.2" em sistemas de 32 bits. A construção abaixo seleciona o nome correto para a arquitetura atual, excluindo qualquer coisa terminada com g, no caso dos comandos abaixo já tiverem sido executados.

[Importante]

Importante

Se existir algum pacote cuja versão seja diferente da versão especificada pelo livro (ou seguindo um aviso de segurança ou satisfazendo preferência pessoal), [então] possivelmente seja necessário atualizar o nome de arquivo da biblioteca em save_usrlib ou online_usrlib. Falhar em fazer isso possivelmente torne o sistema completamente inutilizável.


save_usrlib="$(cd /usr/lib; ls ld-linux*[^g])
             libc.so.6
             libthread_db.so.1
             libquadmath.so.0.0.0
             libstdc++.so.6.0.34
             libitm.so.1.0.0
             libatomic.so.1.2.0"

cd /usr/lib

for LIB in $save_usrlib; do
    objcopy --only-keep-debug --compress-debug-sections=zstd $LIB $LIB.dbg
    cp $LIB /tmp/$LIB
    strip --strip-debug /tmp/$LIB
    objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
    install -vm755 /tmp/$LIB /usr/lib
    rm /tmp/$LIB
done

online_usrbin="bash find strip"
online_usrlib="libbfd-2.45.so
               libsframe.so.2.0.0
               libhistory.so.8.3
               libncursesw.so.6.5
               libm.so.6
               libreadline.so.8.3
               libz.so.1.3.1
               libzstd.so.1.5.7
               $(cd /usr/lib; find libnss*.so* -type f)"

for BIN in $online_usrbin; do
    cp /usr/bin/$BIN /tmp/$BIN
    strip --strip-debug /tmp/$BIN
    install -vm755 /tmp/$BIN /usr/bin
    rm /tmp/$BIN
done

for LIB in $online_usrlib; do
    cp /usr/lib/$LIB /tmp/$LIB
    strip --strip-debug /tmp/$LIB
    install -vm755 /tmp/$LIB /usr/lib
    rm /tmp/$LIB
done

for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
         $(find /usr/lib -type f -name \*.a)                 \
         $(find /usr/{bin,sbin,libexec} -type f); do
    case "$online_usrbin $online_usrlib $save_usrlib" in
        *$(basename $i)* )
            ;;
        * ) strip --strip-debug $i
            ;;
    esac
done

unset BIN LIB save_usrlib online_usrbin online_usrlib

Um número grande de arquivos será sinalizado como erros, por causa do formato de arquivo deles não é reconhecido. Esses avisos podem ser seguramente ignorados. Eles indicam que aqueles arquivos são scripts, não binários.