8.5. Glibc-2.39

O pacote Glibc contém a principal biblioteca C. Essa biblioteca fornece as rotinas básicas para alocação de memória, busca em diretórios, abertura e fechamento de arquivos, leitura e escrita de arquivos, manuseio de sequências de caracteres, correspondência de padrões, aritmética, e daí por diante.

Tempo aproximado de construção: 12 UPC
Espaço em disco exigido: 3,1 GB

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.39-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]

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" -l $(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]

Importante

Se atualizar a Glibc para uma nova versão secundária (por exemplo, da Glibc-2.36 para a Glibc-2.39) 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.26, “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.7.4.”

  • 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.7.4” (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 os locales que podem fazer o sistema responder em um idioma diferente. Nenhum desses locales é exigido, mas se alguns deles estiverem ausentes, [então] as suítes de teste de alguns pacotes pularão casos de teste importantes.

Locales individuais podem ser instalados usando o aplicativo localedef. Por exemplo, o segundo comando localedef abaixo combina a definição de locale 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 locales necessário para a cobertura ótima de testes:

mkdir -pv /usr/lib/locale
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 o locale para seu próprio país, idioma e conjunto de caracteres.

Alternativamente, instale todos os locales listados no arquivo glibc-2.39/localedata/SUPPORTED (inclui cada locale listado acima e muitos 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 locales não listados no arquivo glibc-2.39/localedata/SUPPORTED quando você precisar deles. Por exemplo, os seguintes dois locales são necessários 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]

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, [então] 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"
# Começo /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

# Fim /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 script:

tzselect

Depois de responder à umas poucas perguntas a respeito do local, o script 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 script, 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, [então] 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"
# Begin /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"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

EOF
mkdir -pv /etc/ld.so.conf.d

8.5.3. Conteúdo do Glibc

Aplicativos instalados: gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, ld.so (link simbólico para ld-linux-x86-64.so.2 ou ld-linux.so.2), locale, localedef, makedb, mtrace, pcprofiledump, pldd, sln, sotruss, sprof, tzselect, xtrace, zdump e zic
Bibliotecas instaladas: ld-linux-x86-64.so.2, ld-linux.so.2, libBrokenLocale.{a,so}, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libc_malloc_debug.so, libdl.{a,so.2}, libg.a, libm.{a,so}, libmcheck.a, libmemusage.so, libmvec.{a,so}, libnsl.so.1, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libpcprofile.so, libpthread.{a,so.0}, libresolv.{a,so}, librt.{a,so.1}, libthread_db.so e libutil.{a,so.1}
Diretórios instalados: /usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, /usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, /usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/locale, /usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo e /var/lib/nss_db

Descrições Curtas

gencat

Gera catálogos de mensagem

getconf

Exibe os valores de configuração de sistema para variáveis específicas do sistema de arquivos

getent

Obtém entradas a partir de uma base de dados administrativa

iconv

Realiza conversão de conjuntos de caracteres

iconvconfig

Cria arquivos de configuração de módulos de carregamento rápido do iconv

ldconfig

Configura as ligações de tempo de execução do vinculador dinâmico

ldd

Reporta quis bibliotecas compartilhadas são exigidas por cada dado aplicativo ou biblioteca compartilhada

lddlibc4

Auxilia o ldd com arquivos objeto. Isso não existe em arquiteturas mais novas como x86_64

locale

Imprime várias informações a respeito do locale atual

localedef

Compila especificações de locale

makedb

Cria um banco de dados simples a partir de uma entrada gerada textual

mtrace

Lê e interpreta um arquivo de rastreamento de memória e exibe um resumo em formato legível por humanos

pcprofiledump

Despeja informação gerada pelos perfis do PC

pldd

Lista objetos dinâmicos compartilhados usados por processos em execução

sln

Um aplicativo ln vinculado estaticamente

sotruss

Rastreia chamadas de procedimentos de bibliotecas compartilhadas de um comando especificado

sprof

Lê e exibe dados de perfil de objetos compartilhados

tzselect

Pergunta ao(à) usuário(a) a respeito do local do sistema e relata a correspondente descrição de fuso horário

xtrace

Rastreia a execução de um aplicativo exibindo a função atualmente executada

zdump

O despejador de fuso horário

zic

O compilador de fuso horário

ld-*.so

O aplicativo auxiliar para executáveis de bibliotecas compartilhadas

libBrokenLocale

Usado internamente pela Glibc como um hack grosseiro para executar aplicativos quebrados (por exemplo, alguns aplicativos Motif). Vejam-se comentários em glibc-2.39/locale/broken_cur_max.c para mais informação

libanl

Biblioteca fictícia que não contém funções. Anteriormente era a biblioteca assíncrona de pesquisa de nome, cujas funções agora estão em libc

libc

A biblioteca principal C

libc_malloc_debug

Liga verificação de alocação de memória quando pré-carregada

libdl

Biblioteca fictícia que não contém funções. Anteriormente era a biblioteca de interface do vinculador dinâmico, cujas funções agora estão em libc

libg

Biblioteca fictícia que não contém funções. Anteriormente era uma biblioteca de tempo de execução para g++

libm

A biblioteca matemática

libmvec

A biblioteca de vetor matemático, vinculada conforme necessária quando libm for usada

libmcheck

Liga verificação de alocação de memória quando vinculada para

libmemusage

Usado por memusage para ajudar a coletar informação a respeito do uso de memória de um aplicativo

libnsl

A biblioteca de serviços de rede de comunicação, agora obsoleta

libnss_*

Os módulos de Name Service Switch, contendo funções para resolução de nomes de hosts, nomes de usuárias(os), nomes de grupos, pseudônimos, serviços, protocolos, etc. Carregados pela libc conforme a configuração em /etc/nsswitch.conf

libpcprofile

Pode ser pré-carregada para PC perfilar um executável

libpthread

Biblioteca fictícia que não contém funções. Anteriormente continha funções fornecendo a maioria das interfaces especificadas pelas Extensões de Camadas POSIX.1c e as interfaces de semáforos especificadas pelas Extensões de Tempo Real POSIX.1b; agora as funções estão em libc

libresolv

Contém funções para criação, envio e interpretação de pacotes para os servidores de nomes de domínio da Internet

librt

Contém funções fornecendo a maior parte das interfaces especificadas pelas Extensões de Tempo Real POSIX.1b

libthread_db

Contém funções úteis para construir depuradores para aplicativos de múltiplas camadas

libutil

Biblioteca fictícia que não contém funções. Anteriormente continha código para funções padrão usadas em muitos utilitários Unix. Essas funções agora estão na libc