Atualizações da dietlibc

Atualizações da dietlibc

Atualizações da dietlibc


 Dietlibc é uma biblioteca C 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 como a Newlib.


 Eu já realizei testes de binários linkados a dietlibc (embutils, minised, runit e muitos outros) e os resultados são surpreendentes. Por esse motivo eu torço para que a dietlibc continue recebendo atenção de várias grupos. A ultima versão lançada da dietlibc foi em 2018 porém, no ultimos dois anos, alguns grupos vem postando tanto patches quanto testes para a biblioteca.

 No dia 5 de Janeiro de 2023, Gabriel Ravier enviou um patch com algumas correções no retorno de valores em um recurso chamado wcs{,n}cmp (para near-limits assinado com valores wchar_t). 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.


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 executável. 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 teste."

 Larry criou um tarball de 8 kbyte e postou sem 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 e confira 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. Report 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.


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 (30) btrfs (32) bugs (2) Caixa de Ferramentas do UNIX (19) canto do Diego Lins (2) certificações Linux (7) Código Fonte (54) comandos (32) comp (1) compressores (6) container (7) CPU (19) cracker (1) criptografia (5) crowdfunding (9) cursos (24) daemons (13) Debian (31) desempenho (1) desenvolvimento (95) 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 (12) DragonflyBSD (22) driver (1) 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 (20) Funtoo Linux (13) games (94) garbage collector (1) gerenciadores de pacotes (4) glaucus (4) 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 (138) 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) 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 (169) musl (3) não viva de boatos (9) navegadores (5) NetBSD (7) newlib (1) nim (4) nintendo (1) novatec (17) novidades (1) nuvem (1) o meu ambiente de trabalho (3) off-topic (12) open source (84) OpenBSD (7) OpenShift (1) oracle (1) os vários sabores de Linux (44) padrim (2) palestras e eventos (5) partições (6) pentest (8) performance (1) pipewire (1) plan9 (1) playstation (1) processadores (30) professor Augusto Manzano (11) Programação (66) 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 (13) segurança digital (24) 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 (18) toca do tux (1) toybox (27) tutorial (6) Tux (3) unboxing (7) UNIX (17) UNIX Toolbox (14) vartroy (1) vga (1) virtualização (2) vulnerabilidade (6) wayland (5) web (1) whatsapp (1) whitehat (1) Windows Subsystem for Linux (2) wine (14) WoT (1) yash (1) ZFS (15) zsh (3)