8.5. Glibc-2.37

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: 11 SBU
Espaço em disco exigido: 2.9 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.37-fhs-1.patch

Corrija um problema de segurança identificado pelo(a) desenvolvedor(a):

sed '/width -=/s/workend - string/number_length/' \
    -i stdio-common/vfprintf-process-arg.c

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=3.2                      \
             --enable-stack-protector=strong          \
             --with-headers=/usr/include              \
             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=3.2

Essa opção diz ao sistema de construção que esta Glibc possivelmente seja usada com núcleos tão antigos quanto 3.2. 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 de sistema adicionando código extra para verificar estouros de buffer, tais como ataques de esmagamento de pilha.

--with-headers=/usr/include

Essa opção diz ao sistema de construção onde encontrar os cabeçalhos da API do núcleo.

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.

  • misc/tst-ttyname é conhecido por falhar no ambiente chroot do LFS.

  • O teste stdlib/tst-arc4random-thread é conhecido por falhar se o núcleo do anfitrião for relativamente antigo.

  • Alguns testes, por exemplo nss/tst-nss-files-hosts-multi, são conhecidos por falharem em sistemas relativamente lentos devido a um de tempo limite interno.

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 desnecessária que falha no ambiente parcial do LFS:

sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile

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

Instale o arquivo de configuração e diretório de tempo de execução para o nscd:

cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

Instale os arquivos de suporte do systemd para o nscd:

install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../nscd/nscd.service /usr/lib/systemd/system/nscd.service

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 POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
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.37/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.37/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 POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
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"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /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 ../../tzdata2022g.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, nscd, 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, libcrypt.{a,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, /var/cache/nscd 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

nscd

Um daemon que fornece um cache para as solicitações de serviço de nomes mais comuns

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.37/locale/broken_cur_max.c para mais informação

libanl

Uma biblioteca assíncrona de pesquisa de nomes

libc

A biblioteca principal C

libc_malloc_debug

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

libcrypt

A biblioteca de criptografia

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 maior parte das interfaces especificadas pela Extensão POSIX.1b de Tempo Real, agora as funções estão na 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 pela Extensão POSIX.1b de Tempo Real

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