Detalhes acerca desse pacote estão localizados na Seção 8.5.3, “Conteúdo do Glibc.”
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.
Primeiro, crie um link simbólico para conformidade com a LSB. Adicionalmente, para x86_64, crie um link simbólico de compatibilidade exigido para a operação adequada do carregador dinâmico de biblioteca:
case $(uname -m) in i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 ;; x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64 ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3 ;; esac
O comando acima está correto. O comando "ln" tem várias versões sintáticas, de forma que tenha certeza de verificar "info coreutils ln" e "ln(1)" antes de informar o que possivelmente aparente ser um erro.
Alguns dos aplicativos Glibc usam o diretório não conforme com a
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 a FHS:
patch -Np1 -i ../glibc-2.42-fhs-1.patch
A documentação da Glibc recomenda construir a Glibc em um diretório dedicado à construção:
mkdir -v build cd build
Assegure que os utilitários ldconfig e sln sejam instalados em
/usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
A seguir, prepare a Glibc para compilação:
../configure \ --prefix=/usr \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --disable-nscd \ libc_cv_slibdir=/usr/lib \ --enable-kernel=5.4
O significado das opções do configure:
--host=$LFS_TGT,
--build=$(../scripts/config.guess)
O efeito combinado dessas chaves é o de que o sistema de
construção da Glibc se autoconfigura para ser compilado
cruzadamente, usando o vinculador cruzado e o compilador
cruzado em $LFS/tools
.
--enable-kernel=5.4
Isso diz para a Glibc para compilar a biblioteca com suporte para núcleos Linux 5.4 e posteriores. Contornos para núcleos mais antigos não estão habilitados.
libc_cv_slibdir=/usr/lib
Isso garante que a biblioteca seja instalada em /usr/lib em vez do padrão /lib64 em máquinas de 64 bits.
--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.
Durante este estágio o seguinte aviso pode aparecer:
configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
O ausente ou incompatível aplicativo msgfmt geralmente é inofensivo. Esse aplicativo msgfmt é parte do pacote Gettext, que a distribuição anfitriã deveria fornecer.
Tem havido informes de que esse pacote possivelmente falhe quando
construir-se como um “make paralelo”. Se isso ocorrer, [então]
reexecute o comando "make" com a opção "-j1
".
Compile o pacote:
make
Instale o pacote:
Se LFS
não estiver adequadamente
configurada, e a despeito das recomendações, você estiver
construindo como root
, [então] o
próximo comando instalará a recém construída Glibc em seu sistema
anfitrião, o que quase certamente o tornará inutilizável.
Portanto, verifique duas vezes se o ambiente está corretamente
configurado e que você não é o(a) root
antes de executar o seguinte comando.
make DESTDIR=$LFS install
O significado da opção make install:
DESTDIR=$LFS
A variável DESTDIR
do make é usada
por quase todos os pacotes para definir o local onde o pacote
deveria ser instalado. Se ela não estiver configurada,
padroniza para o diretório raiz (/
). Aqui nós especificamos que o pacote
seja instalado em $LFS
, que se
tornará o diretório raiz na Seção 7.4, “Entrando
no Ambiente Chroot.”
Corrija caminho codificado rigidamente para o carregador de executável no script ldd:
sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
Agora que nosso conjunto cruzado de ferramentas está no lugar, é importante garantir que compilação e vinculação funcionarão conforme esperado. Nós fazemos isso realizando algumas verificações de sanidade:
echo 'int main(){}' | $LFS_TGT-gcc -x c - -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Não deveriam existir erros, e a saída gerada do último comando será (levando em consideração diferenças específicas da plataforma no nome do vinculador dinâmico):
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Observe que esse caminho não deveria conter /mnt/lfs
(ou o valor da variável LFS
se você usou uma diferente). O caminho é
resolvido quando o programa compilado for executado, e isso só
deveria acontecer depois que nós entrarmos no ambiente chroot onde
o núcleo consideraria $LFS
como o
diretório raiz (/
).
Agora certifique-se de que nós estamos configurados para usar os arquivos corretos de iniciação:
grep -E -o "$LFS/lib.*/S?crt[1in].*succeeded" dummy.log
A saída gerada do último comando deveria ser:
/mnt/lfs/lib/../lib/Scrt1.o succeeded
/mnt/lfs/lib/../lib/crti.o succeeded
/mnt/lfs/lib/../lib/crtn.o succeeded
Verifique se o compilador está procurando os arquivos corretos de cabeçalho:
grep -B3 "^ $LFS/usr/include" dummy.log
Esse comando deveria retornar a seguinte saída gerada:
#include <...> search starts here:
/mnt/lfs/tools/lib/gcc/x86_64-lfs-linux-gnu/15.2.0/include
/mnt/lfs/tools/lib/gcc/x86_64-lfs-linux-gnu/15.2.0/include-fixed
/mnt/lfs/usr/include
Novamente, o diretório nomeado depois do teu tripleto alvo possivelmente seja diferente do acima, dependendo da arquitetura do teu sistema.
Agora, verifique se o novo vinculador está sendo usado com os caminhos corretos de procura:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Referências para caminhos que tenham componentes com '-linux-gnu' deveriam ser ignoradas, porém, do contrário, a saída gerada do último comando deveria ser:
SEARCH_DIR("=/mnt/lfs/tools/x86_64-lfs-linux-gnu/lib64")
SEARCH_DIR("=/usr/local/lib64")
SEARCH_DIR("=/lib64")
SEARCH_DIR("=/usr/lib64")
SEARCH_DIR("=/mnt/lfs/tools/x86_64-lfs-linux-gnu/lib")
SEARCH_DIR("=/usr/local/lib")
SEARCH_DIR("=/lib")
SEARCH_DIR("=/usr/lib");
Um sistema de 32 bits possivelmente use alguns outros diretórios,
mas de qualquer maneira o aspecto importante aqui é que todos os
caminhos deveriam começar com um sinal de igual (=
), que seria substituído pelo diretório sysroot
que nós configuramos para o vinculador.
Em seguida, tenha certeza de que nós estamos usando a libc correta:
grep "/lib.*/libc.so.6 " dummy.log
A saída gerada do último comando deveria ser:
attempt to open /mnt/lfs/usr/lib/libc.so.6 succeeded
Tenha certeza de que GCC está usando o vinculador dinâmico correto:
grep found dummy.log
A saída gerada do último comando deveria ser (levando em consideração diferenças específicas da plataforma no nome do vinculador dinâmico):
found ld-linux-x86-64.so.2 at /mnt/lfs/usr/lib/ld-linux-x86-64.so.2
Se a saída gerada não aparecer conforme mostrado acima ou não for recebida, então alguma coisa está seriamente errada. Investigue e refaça as etapas para descobrir onde está o problema e corrija-o. Quaisquer problemas deveriam ser resolvidos antes de se continuar com o processo.
Uma vez que tudo esteja funcionando corretamente, remova os arquivos de teste:
rm -v a.out dummy.log
Construir os pacotes no próximo capítulo servirá como uma verificação adicional de que o conjunto de ferramentas foi construído adequadamente. Se algum pacote, especialmente o Binutils-passagem 2 ou o GCC-passagem 2, falhar na construção, [então] isso é uma indicação de que alguma coisa deu errado com as instalações anteriores doe Binutils, GCC ou da Glibc.
Detalhes acerca desse pacote estão localizados na Seção 8.5.3, “Conteúdo do Glibc.”