Lançada dietlibc 0.35

dietlibc 0.35 released

Lançada dietlibc 0.35


 Finalmente, depois de seis anos, foi lança a versão 0.35 da biblioteca dietlibc que é muito abordada tanto aqui no blog quanto no canal. Por mais que não seja popularmente conhecida, essa é uma biblioteca fortemente utilizada em vários ambientes, especialmente em embarcados assim também como a Newlib.


 Eu já realizei testes de binários linkados à dietlibc (como o embutils que é um pacote parecido com o coreutils, minised, runit e muitos outros) e os resultados são surpreendentes. Por esse motivo eu torço para que a dietlibc continue recebendo cada vez mais atenção de várias grupos. A versão 0.34 da dietlibc havia sido lançada em 2018 porém, no últimos dois anos, alguns grupos vem enviando tanto patches quanto testes para a biblioteca.
 No dia 5 de Janeiro de 2023 por exemplo, Gabriel Ravier enviou um patch com algumas correções no retorno de valores do recurso wcs{,n}cmp (para near-limits assinado com valores wchar_t) correções em seu comportamento e correções que evitam overfalow. Mas esta não foi a sua única contribuição; Gabriel fez o total de dez contribuições corrigindo várias falhas (especialmente do printf), adicionando melhor segurança, definindo valores e adicionando novos recursos (um deles no scanf).

 Já no dia 13 de Janeiro do mesmo ano, Jai Arora, Abhishek Rose, Shubhani Gupta e Sorav Bansal da empresa indiana CompilerAI Research GroupIIT reportaram uma série de bugs em funções da dietlibc. A empresa foi tão organizada que disponibilizou códigos fonte em seu próprio repositório no Github e quais flags foram utilizadas durante o processo de compilação para que os bugs possam ser reproduzidos, analisados e assim futuramente corrigidos. Acredito que boa parte possa ter sido corrigido nessa nova versão.


Bessel e ARM na dietlibc
 Ficamos um bom tempo sem noticias até que Larry Doolittle, que participa também do desenvolvimento do TinyCC, enviou no final do ano passado dois patches; um com apenas nove linhas e outro com mais sete, para que sejam utilizados nos sub-testes runtests.sh e funcionarem melhor. Sem eles, há certos bugs que fazem com que o shell reclame que cada arquivo dentro de test/*/runtests.sh não seja executado. Outro trabalho que Larry está atuando é na função de Bessel que aponta das versões 12 e 13 do GCC.  
"Eu sei algo sobre funções de Bessel, então isso despertou meu interesse e comecei a me aprofundar. Eu aprendi duas coisas principais: bessel.c inclui uma seção escrita somente para x86 e não possui nenhum banco de testes."
 Larry criou um tarball de 8 kbyte e postou em seu site pessoal contendo implementações de código de pesquisa bessel.c reescritos de forma simples e portável. O arquivos pode ser baixado em: 
 A integridade do arquivo pode ser verificada utilizando sha256sum conferindo o resultado a seguir:

18da50d99030c680d1dfa33e2f78e3abf056a2b91a3d530a6b42d1116e8f67a9  diet-bessel-test.tar.gz

 Esse código inclui também um banco de teste que podem ser realizados com a opção make -C test e obter os resultados parecidos com os abaixo:

$ make -C test  # riscv64
make: Entering directory '/redacted/test'
gcc -std=c99 -O2 -pedantic -Wall -Wextra -I../include bessel.c ../libm/bessel.c -lm -o bessel
./bessel
Bessel function test with sizeof(double) == 8 and sizeof(long double) == 16
in 176: J max errors 0.0000000000000021 0.00000000005 0.00000000005 0.0000000009
in 175: Y max errors 0.00000000005 0.00000000023 0.000000005 0.000000084
max |J| at known zeros 0.00000000002 0.0000016 0.0000011
max |Y| at known zeros 0.00000000087 0.0000011 0.0000007
Y_0 at first zero 0.00000000327
Hankel modulus-squared max error 0.00000000039
PASS

$ make -C test  # x86_64
make: Entering directory '/redacted/test'
gcc -std=c99 -O2 -pedantic -Wall -Wextra -I../include bessel.c ../libm/bessel.c -lm -o bessel
./bessel
Bessel function test with sizeof(double) == 8 and sizeof(long double) == 16
in 176: J max errors 0.0000000000000513 0.00000000005 0.00000000005 0.0000000009
in 175: Y max errors 0.00000000005 0.00000000023 0.000000005 0.000000084
max |J| at known zeros 0.00000000002 0.0000016 0.0000011
max |Y| at known zeros 0.00000000087 0.0000011 0.0000007
Y_0 at first zero 0.00000000327
Hankel modulus-squared max error 0.00000000039
PASS

 

$ make -C test  # armv7l (armhf)
make: Entering directory '/redacted/test'
gcc -std=c99 -O2 -pedantic -Wall -Wextra -I../include bessel.c ../libm/bessel.c -lm -o bessel
./bessel
Bessel function test with sizeof(double) == 8 and sizeof(long double) == 8
in 176: J max errors 0.0000000000456691 0.00000000007 0.00000000008 0.0000000009
in 175: Y max errors 0.00000000014 0.00000000023 0.000000005 0.000000084
max |J| at known zeros 0.00000000002 0.0000016 0.0000011
max |Y| at known zeros 0.00000000087 0.0000011 0.0000007
Y_0 at first zero 0.00000000327
Hankel modulus-squared max error 0.00000000139
FAIL
 
 O novo banco de testes é quatro vezes maior e Larry trabalha para concluir a documentação antes de submeter o patch. E por ultimo, Larry reportou um problema que ocorre na dietlibc com a arquitetura ARM quando utilizadas algumas flags. Não se trata de um problema exclusivo na arquitetura ARM, esses erros ocorrem em muitas arquiteturas, menos em x86_64 e x32.
"DEFAULTCFLAGS e seu -nostdinc também é problemático para construir json em qualquer arquitetura exceto em x86_64 and x32... ...gamma.h sofre da mesma codificação específica 387 assim como bessel.c. ... ... Tentar consrtuir código de usuário utilizando quaisquer funções matemática falha, faltando coisas como sin cos exp log, que são definidas em assembly em x86_64 e i386. ..."
 Estes são alguns trechos que eu traduzi e que notei que o grande problema é que estes recursos não foram portados para outras arquiteturas. Agora é esperar que as comunidades trabalhem nos problemas. Reports já temos.


More working around optimiser bugs (04/07/2024)

 Thorsten Glaser da Evolvis informou que a dietlibc entra em um loop interminável na arquitetura arm64 devido o GCC otimizar a implementação da chamada strlen. Uma solução sugerida por Thorsten foi adicionar a opção -ffreestanding na variável DEFAULTCFLAGS (e IMHO bootloaders, kernels e libcs também precisam ser construídas com essa opção) que corrige esse problema.

Há muitos recursos ainda pendentes na dietlibc conforme podemos conferir nesta tabela de comparações de implementações de bibliotecas C para Linux porém, acredito que este lançamento tenha sido muito importante tendo um total de 23 novos recursos, 3 de segurança, 1 definição e 12 correções que podem ser conferidos clicando aqui.

 Eu baixei e testei a nova versão da dietlibc compilando tanto em embutils, quanto o minised e o runit e todos foram bem sucedidos; não houve incompatibilidade com a nova versão.





Comente com o Facebook:

Nenhum comentário:

Postar um comentário

Viu algum erro e quer compartilhar seu conhecimento? então comente aí.

Observação: somente um membro deste blog pode postar um comentário.

Marcadores

A pior história sobre Linux que já ouvi (5) A.I (2) ambiente gráfico (19) AMD (14) analise (10) Andriod (16) android (7) Apple (1) arm (5) artigo (5) aws (1) bc (23) benchmark (6) BetrFS (1) blackhat (1) BSDs (31) btrfs (32) bugs (2) Caixa de Ferramentas do UNIX (19) canto do Diego Lins (2) certificações Linux (7) Código Fonte (54) comandos (33) comp (1) compressores (9) container (8) CPU (19) cracker (1) criptografia (5) crowdfunding (9) cursos (24) daemons (13) Debian (31) desempenho (2) desenvolvimento (98) desktop (19) DevOps (3) DevSecOps (4) dic (1) Dica de leitura (91) dica DLins (2) dicas do Flávio (27) Dicas TechWarn (1) diet libc (3) diocast (1) dioliunx (3) distribuições Linux (14) Docker (13) DragonflyBSD (22) driver (2) dropbear (3) ead Diolinux (2) edição de vídeo (5) embarcados (1) EMMI Linux (4) emuladores (9) endless (5) English interview (3) Enless OS (2) entrevista (17) espaço aberto (82) evento (6) facebook (1) Fedora (11) filesystem (82) financiamento coletivo (2) fork (4) fox n forests (4) FreeBSD (21) Funtoo Linux (13) games (94) garbage collector (1) gerenciadores de pacotes (4) glaucus (7) GOG (3) google (9) gpu (3) hacker (2) hardware (104) hash (1) helenos (3) I.A (1) init system (12) Intel (15) inteligencia artificial (2) IoT (1) ispconfig (1) jogos (38) kde (1) kernel (141) lançamento (64) leis (1) LFCS (1) libs (2) licenças (8) Linus (16) linus torvalds (2) Linux (194) linux foundation (3) linux para leigos (1) live (5) lkgr (1) LPI (8) LTS (1) Mac (1) machine learning (1) matemática (9) mesa redonda (27) microcontroladores (1) microsoft (6) microst (1) muito além do GNU (172) musl (3) não viva de boatos (9) navegadores (5) NetBSD (7) newlib (1) nim (6) nintendo (1) novatec (17) novidades (1) nuvem (1) o meu ambiente de trabalho (3) off-topic (12) ONLYOFFICE (1) open source (84) OpenBSD (7) OpenShift (1) oracle (1) os vários sabores de Linux (45) padrim (2) palestras e eventos (5) partições (6) pentest (8) performance (1) pipewire (1) plan9 (2) playstation (1) processadores (30) professor Augusto Manzano (11) Programação (68) promoção (1) propagandas com Linux (8) ps4 (1) real-time. (1) Red Hat (23) redes (4) resenha nerd (4) Resumo da Semana do Dlins (2) resumo do Tux (19) retrospectiva Linux (1) risc-V (14) RISCV (13) rtos (1) runlevel (2) rust (14) segurança digital (25) servidor web (2) servidores (3) shell (9) shell script (8) sistema operacional (25) skarnet (2) smartphones (3) Software livre e de código aberto (151) sorteio (3) Steam (10) Steam no Linux (8) supercomputadores (4) suse (6) systemd (8) terminal (89) terminal de comandos (19) toca do tux (1) toybox (27) tutorial (6) Tux (3) unboxing (7) UNIX (17) UNIX Toolbox (14) vartroy (1) vga (1) virtualização (3) vulnerabilidade (6) wayland (5) web (1) whatsapp (1) whitehat (1) Windows Subsystem for Linux (2) wine (14) WoT (1) yash (1) ZFS (16) zsh (3)