8.5.1. Instalação da Glibc
        
        
          Alguns dos aplicativos Glibc usam o diretório não conforme com o
          FHS /var/db para armazenar os dados
          em tempo de execução deles. Aplique o seguinte remendo para fazer
          com que tais aplicativos armazenem os dados em tempo de execução
          deles nos locais conformes com o FHS:
        
        patch -Np1 -i ../glibc-2.40-fhs-1.patch
        
          A documentação da Glibc recomenda construir a Glibc em um diretório
          dedicado à construção:
        
        mkdir -v build
cd      build
        
          Garanta que os utilitários ldconfig e sln serão instalados no
          /usr/sbin:
        
        echo "rootsbindir=/usr/sbin" > configparms
        
          Prepare a Glibc para compilação:
        
        ../configure --prefix=/usr                            \
             --disable-werror                         \
             --enable-kernel=4.19                     \
             --enable-stack-protector=strong          \
             --disable-nscd                           \
             libc_cv_slibdir=/usr/lib
        
          
            O significado das opções do configure:
          
          
            - 
              
--disable-werror
             
            - 
              
                Essa opção desabilita a opção -Werror passada para o GCC.
                Isso é necessário para executar a suíte de teste.
              
             
            - 
              
--enable-kernel=4.19
             
            - 
              
                Essa opção diz ao sistema de construção que esta Glibc
                possivelmente seja usada com núcleos tão antigos quanto 4.19.
                Isso significa que a geração de contornos, no caso de uma
                chamada de sistema introduzida em uma versão posterior, não
                pode ser usada.
              
             
            - 
              
--enable-stack-protector=strong
             
            - 
              
                Essa opção aumenta a segurança do sistema adicionando código
                extra para verificar estouros de buffer, como ataques de
                esmagamento de pilha. Observe que a Glibc sempre substitui
                explicitamente o padrão do GCC, de forma que essa opção ainda
                é necessária mesmo que já tenhamos especificado --enable-default-ssp para GCC.
              
             
            - 
              
--disable-nscd
             
            - 
              
                Não construa o processo de segundo plano de armazenamento
                temporário do serviço de nomes, o qual não mais é usado.
              
             
            - 
              
libc_cv_slibdir=/usr/lib
             
            - 
              
                Essa variável configura a biblioteca correta para todos os
                sistemas. Nós não queremos que a lib64 seja usada.
              
             
          
         
        
          Compile o pacote:
        
        make
        
          
          
            Importante
          
          
            Nesta seção, a suíte de teste para a Glibc é considerada crítica.
            Não pule-a sob qualquer circunstância.
          
         
        
          Geralmente uns poucos testes não passam. As falhas de teste
          listadas abaixo usualmente são seguras ignorar.
        
        
make check
        
          Você possivelmente veja algumas falhas de teste. A suíte de teste
          da Glibc é de alguma forma dependente do sistema anfitrião. Umas
          poucas falhas saídas de mais que 5.000 testes geralmente podem
          ignoradas. Esta é uma lista dos problemas mais comuns vistos para
          versões recentes do LFS:
        
        
          
            - 
              
                io/tst-lchmod é
                conhecido por falhar no ambiente chroot do LFS.
              
             
            - 
              
                Alguns testes, por exemplo nss/tst-nss-files-hosts-multi e
                nptl/tst-thread-affinity* são
                conhecidos por falharem devido a um tempo limite
                (especialmente quando o sistema está relativamente lento e
                (ou) executando a suíte de teste com várias tarefas make
                paralelas). Esses testes podem ser identificados com:
              
              grep "Timed out" $(find -name \*.out)
              
                É possível reexecutar um teste com tempo limite aumentado com
                TIMEOUTFACTOR=<fator> make test
                t=<nome do
                teste>. Por exemplo,
                TIMEOUTFACTOR=10 make test
                t=nss/tst-nss-files-hosts-multi reexecutará
                nss/tst-nss-files-hosts-multi com
                dez vezes o tempo limite original.
              
             
            - 
              
                Além disso, alguns testes possivelmente falhem com um modelo
                de CPU relativamente antigo (por exemplo elf/tst-cpu-features-cpuinfo) ou
                versão do núcleo do anfitrião (por exemplo stdlib/tst-arc4random-thread).
              
             
          
         
        
          Mesmo sendo uma mensagem inofensiva, o estágio de instalação da
          Glibc reclamará acerca da ausência do /etc/ld.so.conf. Evite esse aviso com:
        
        touch /etc/ld.so.conf
        
          Corrija o Makefile para pular uma verificação de sanidade
          desatualizada que falha com uma configuração moderna da Glibc:
        
        sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
        
          
          
            Importante
          
          
            Se atualizar a Glibc para uma nova versão secundária (por
            exemplo, da Glibc-2.36 para a Glibc-2.40) em um sistema LFS em
            execução, [então] você precisará tomar algumas precauções extras
            para evitar quebrar o sistema:
          
          
            
              - 
                
                  Atualizar a Glibc em um sistema LFS anterior ao 11.0
                  (exclusivo) não é suportado. Reconstrua o LFS se você
                  estiver executando um sistema LFS antigo, mas precisar de
                  uma Glibc mais recente.
                
               
              - 
                
                  Se atualizar em um sistema LFS anterior a 12.0 (exclusivo),
                  [então] instale a Libxcrypt seguindo a Seção 8.27,
                  “Libxcrypt-4.4.36.” Além de uma instalação normal da
                  Libxcrypt, você DEVE seguir a observação na seção
                  Libxcrypt para instalar a libcrypt.so.1* (substituindo libcrypt.so.1 originária da instalação
                  anterior da Glibc).
                
               
              - 
                
                  Se atualizar em um sistema LFS anterior ao 12.1
                  (exclusivo), [então] remova o aplicativo nscd:
                
                rm -f /usr/sbin/nscd
                
                  Se esse sistema (anterior ao LFS 12.1, exclusivo) for
                  baseado em Systemd, [então] também é necessário desabilitar
                  e parar o serviço nscd agora:
                
                systemctl disable --now nscd
               
              - 
                
                  Atualize o núcleo e reinicialize se ele for mais antigo que
                  4.19 (verifique a versão atual com uname -r) ou se quiser
                  atualizá-lo mesmo assim, seguindo a Seção 10.3, “Linux-6.10.5.”
                
               
              - 
                
                  Atualize os cabeçalhos da API do núcleo se forem mais
                  antigos que 4.19 (verifique a versão atual com cat
                  /usr/include/linux/version.h) ou se quiser
                  atualizá-los mesmo assim, seguindo a Seção 5.4,
                  “Cabeçalhos da API do Linux-6.10.5” (mas removendo
                  $LFS do comando cp).
                
               
              - 
                
                  Realize uma instalação DESTDIR e
                  atualize as bibliotecas compartilhadas da Glibc no sistema
                  usando um comando simples install:
                
                make DESTDIR=$PWD/dest install
install -vm755 dest/usr/lib/*.so.* /usr/lib
               
            
           
          
            É obrigatório seguir rigorosamente essas etapas acima, a menos
            que você entenda completamente o que está fazendo. Qualquer desvio inesperado possivelmente torne o
            sistema completamente desusável. VOCÊ ESTÁ
            AVISADO(A).
          
          
            Em seguida, continue a executar o comando make install, o comando
            sed contra o
            /usr/bin/ldd e os comandos para
            instalar as localidades. Assim que estiverem finalizados,
            reinicialize o sistema imediatamente.
          
         
        
          Instale o pacote:
        
        make install
        
          Corrija um caminho codificado rigidamente para o carregador de
          executável no script ldd:
        
        sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
        
          Em seguida, instale as localidades que podem fazer o sistema
          responder em um idioma diferente. Nenhuma dessas localidades é
          exigida, mas se algumas delas estiverem ausentes, as suítes de
          teste de alguns pacotes pularão importantes casos de teste.
        
        
          Localidades individuais podem ser instaladas usando-se o programa
          localedef. Por
          exemplo, o segundo comando localedef abaixo combina a
          definição de localidade independente do conjunto de caracteres
          /usr/share/i18n/locales/cs_CZ com a
          definição de mapa de caracteres /usr/share/i18n/charmaps/UTF-8.gz e adiciona o
          resultado ao arquivo /usr/lib/locale/locale-archive. As seguintes
          instruções instalarão o conjunto mínimo de localidades necessário
          para a cobertura ótima de testes:
        
        localedef -i C -f UTF-8 C.UTF-8
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_ES -f ISO-8859-15 es_ES@euro
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8
        
          Adicionalmente, instale a localidade para teu próprio país, idioma
          e conjunto de caracteres.
        
        
          Alternativamente, instale todas as localidades listadas no arquivo
          glibc-2.40/localedata/SUPPORTED
          (inclui cada localidade listada acima e muitas mais) de uma vez com
          o seguinte comando consumidor de tempo:
        
        make localedata/install-locales
        
          Então, use o comando localedef para criar e instalar
          localidades não listadas no arquivo glibc-2.40/localedata/SUPPORTED quando você
          precisar delas. Por exemplo, as seguintes duas localidades são
          necessárias para alguns testes posteriormente neste capítulo:
        
        localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
        
          
          
            Nota
          
          
            A Glibc agora usa a libidn2 quando resolver nomes
            internacionalizados de domínio. Essa é uma dependência de tempo
            de execução. Se essa capacidade for necessária, as instruções
            para instalar a libidn2 estão na 
            página da libidn2 do BLFS.
          
         
       
      
        
          8.5.2. Configurando a
          Glibc
        
        
          
            8.5.2.1. Adicionando o nsswitch.conf
          
          
            O arquivo /etc/nsswitch.conf
            precisa ser criado, pois os padrões da Glibc não funcionam bem em
            um ambiente de rede de comunicação.
          
          
            Crie um novo arquivo /etc/nsswitch.conf executando o seguinte:
          
          cat > /etc/nsswitch.conf << "EOF"
# Inicia /etc/nsswitch.conf
passwd: files systemd
group: files systemd
shadow: files systemd
hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# Termina /etc/nsswitch.conf
EOF
         
        
          
            8.5.2.2. Adicionando Dados de Fuso Horário
          
          
            Instale e configure os dados de fuso horário com o seguinte:
          
          tar -xf ../../tzdata2024a.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward; do
    zic -L /dev/null   -d $ZONEINFO       ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix ${tz}
    zic -L leapseconds -d $ZONEINFO/right ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
          
            
              O significado dos comandos zic:
            
            
              - 
                
zic -L
                /dev/null ...
               
              - 
                
                  Isso cria fusos horários posix sem quaisquer segundos
                  bissextos. É convencional colocá-los em ambos zoneinfo e zoneinfo/posix. É necessário colocar os
                  fusos horários POSIX em zoneinfo, do contrário várias suítes de
                  teste reportarão erros. Em um sistema embarcado, onde o
                  espaço é apertado e você não pretende nunca atualizar os
                  fusos horários, você poderia economizar 1,9 MB não usando o
                  diretório posix, mas alguns
                  aplicativos ou suítes de teste poderiam produzir algumas
                  falhas.
                
               
              - 
                
zic -L
                leapseconds ...
               
              - 
                
                  Isso cria fusos horários corretos, incluindo segundos
                  bissextos. Em um sistema embarcado, onde o espaço é
                  apertado e você não pretende nunca atualizar os fusos
                  horários ou se importa com a hora correta, você poderia
                  economizar 1,9 MB omitindo o diretório right.
                
               
              - 
                
zic ... -p
                ...
               
              - 
                
                  Isso cria o arquivo posixrules. Nós usamos New York, pois
                  POSIX exige que as regras de horário de verão estejam de
                  acordo com regras dos Estados Unidos da América do Norte.
                
               
            
           
          
            Uma maneira para determinar o fuso horário local é a de executar
            o seguinte conjunto de comandos sequenciais:
          
          tzselect
          
            Depois de responder à umas poucas perguntas a respeito do local,
            o conjunto de comandos sequenciais retornará o nome do fuso
            horário (por exemplo, America/Edmonton). Existem também
            alguns outros possíveis fusos horários listados em /usr/share/zoneinfo, tais como Canada/Eastern ou EST5EDT que não são identificados pelo
            conjunto de comandos sequenciais, mas podem ser usados.
          
          
            Então crie o arquivo /etc/localtime
            executando:
          
          ln -sfv /usr/share/zoneinfo/<xxx> /etc/localtime
          
            Substitua <xxx>
            pelo nome do fuso horário selecionado (por exemplo,
            Canada/Eastern).
          
         
        
          
            8.5.2.3. Configurando o
            Carregador Dinâmico
          
          
            Por padrão, o carregador dinâmico (/lib/ld-linux.so.2) procura em /usr/lib por bibliotecas dinâmicas que são
            necessárias para aplicativos assim que são executados.
            Entretanto, se existirem bibliotecas em outros diretórios
            diferentes do /usr/lib, esses
            precisam ser adicionados ao arquivo /etc/ld.so.conf para a finalidade de que o
            carregador dinâmico encontre elas. Dois diretórios que são
            comumente conhecidos por conterem bibliotecas adicionais são
            /usr/local/lib e /opt/lib; então adicione esses diretórios ao
            caminho de busca do carregador dinâmico.
          
          
            Crie um novo arquivo /etc/ld.so.conf executando o seguinte:
          
          cat > /etc/ld.so.conf << "EOF"
# Inicia /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
          
            Se desejado, o carregador dinâmico também pode pesquisar um
            diretório e incluir o conteúdo de arquivos encontrados lá.
            Geralmente os arquivos nesse diretório include são uma linha
            especificando o caminho de biblioteca desejado. Para adicionar
            essa capacidade, execute os seguintes comandos:
          
          cat >> /etc/ld.so.conf << "EOF"
# Adiciona um diretório de inclusão
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d