Após seis meses de desenvolvimento, foi lançado o sistema da biblioteca GNU C Library (glibc) 2.41, que atende completamente aos requisitos dos padrões ISO C11 e POSIX.1-2017. No desenvolvimento da nova versão participaram 79 desenvolvedores.
Entre as melhorias implementadas no Glibc 2.41, destacam-se:
- Para a plataforma Linux, foram adicionadas novas funções sched_setattr e sched_getattr, que permitem definir/ler os parâmetros do escalonador de tarefas. Na prática, as funções permitem ajustar as políticas de escalonamento de solicitações, como SCHED_DEADLINE, que utilizam parâmetros adicionais além da prioridade.
- O utilitário iconv agora suporta a conversão de codificação in-loco (se os nomes dos arquivos de entrada e saída coincidirem, o iconv agora cria automaticamente um arquivo temporário e, após a conclusão da conversão, substitui o arquivo original por ele).
- No arquivo de cabeçalho math.h, foram adicionadas funções trigonométricas que apareceram no padrão C23 (TS 18661-4:2015): acospi, asinpi, atan2pi, atanpi, cospi, sinpi e tanpi.
- Do projeto CORE-MATH foram transferidas versões otimizadas e com arredondamento correto das funções exp10m1f, exp2m1f, expm1f, log10f, log2p1f, log1pf, log10p1f, cbrtf, erff, erfcf, lgammaf, tgammaf, tanf, acosf, acoshf, asinf, asinhf, atanf, atan2f, atanhf, coshf, sinhf e tanhf.
- Foi adicionada a suporte à extensão ARM64 GCS (Guarded Control Stack) para proteger hardware endereços de retorno das funções e bloquear exploits que utilizam técnicas de programação orientada a retorno (ROP — Return-Oriented Programming, onde o exploit é formado a partir de trechos já existentes de instruções de máquina que terminam com uma instrução de retorno). O ARM64 GCS permite usar para proteger processos no espaço do usuário a técnica de pilha sombra (shadow stack) — após a transmissão de controle para uma função, os endereços de retorno são armazenados pelo processador não apenas na pilha normal, mas também em uma pilha sombra separada, que não pode ser alterada diretamente. Antes de sair da função, o endereço de retorno é extraído da pilha sombra e verificado com o endereço de retorno da pilha principal. Para compilar o Glibc com suporte a GCS, é necessário ter pelo menos as versões binutils 2.44 e GCC 15.
- Foi realizado um grande trabalho para melhorar a geração de código e aumentar o desempenho das funções matemáticas para a arquitetura ARM64/AArch64. Foram implementadas otimizações usando instruções vetoriais (SVE, Scalable Vector Extension) e extensões SIMD (Neon).
- Para sistemas com processadores ARM64/AArch64, foi adicionado suporte ao mecanismo Memory Protection Keys, utilizado para restringir o acesso às páginas de memória sem modificar a tabela de páginas de memória.
- Para sistemas com processadores PowerPC64, foi adicionado suporte a instruções avançadas para proteção contra a exploração de programação de retorno em exploits.
- Adicionado um novo tipo de arquitetura arch_kind_hygon para os processadores x86-64 Hygon da China, baseados em tecnologias da AMD.
- Ampliado significativamente o conjunto de testes do glibc, cujo número de testes aumentou de 5408 para 6232 em comparação com a versão anterior.
- Adicionada a capacidade de testar a construção do glibc usando compiladores de C e C++ distintos daqueles usados para a construção real. Por exemplo, ‘configure TEST_CC="gcc-6.4.1" TEST_CXX="g++-6.4.1"‘ e ‘configure TEST_CC="clang" TEST_CXX="clang++"‘.
- Nas opções especificadas no arquivo /etc/resolv.conf e na variável de ambiente RES_OPTIONS, implementada a possibilidade de usar o prefixo «-» para remover a opção previamente definida com esse nome. Por exemplo, se no arquivo /etc/resolv.conf estiver definido «options no-aaaa», ao iniciar o processo com a variável de ambiente «RES_OPTIONS=-no-aaaa» será cancelada a proibição de envio de consultas DNS para obter registros AAAA.
- No resolvedor DNS, foi adicionado suporte à opção «strict-error», na qual a função getaddrinfo(), se o tipo de endereços não for explicitamente especificado (AF_UNSPEC), tentará obter valores dos registros A (IPv4) e AAAA (IPv6) de outro servidor DNS, caso a consulta do registro A ou AAAA para o primeiro servidor DNS falhe. Sem a opção «strict-error», em tal situação, será retornado o endereço obtido na consulta processada com sucesso, enquanto o valor da consulta não bem-sucedida será ignorado. Por exemplo, se servidor retornou o registro «A», mas gerou um erro ao solicitar «AAAA», getaddrinfo sem a opção «strict-error» retornará imediatamente apenas o endereço IPv4, enquanto com a opção «strict-error» tentará repetir as solicitações para outro servidor DNS.
- Os dados de codificação, informações sobre tipos de caracteres e tabelas de transliteração foram atualizados para suportar a especificação Unicode 16.0.0.
- Adicionado o macro «_ISOC2Y_SOURCE», que permite ativar as funcionalidades definidas no rascunho do padrão C2Y. Funcionalidades semelhantes também podem ser ativadas usando o macro _GNU_SOURCE e através das flags do compilador («gcc -std=gnu2y»).
- Implementada a ferramenta benchtest para monitoramento do desempenho de várias funções (geralmente matemáticas).
- Adicionada a configuração glibc.rtld.execstack, que permite explicitamente proibir o uso de pilha executável.
- Adicionada a suporte ao ABI extensível rseq (sequences reiniciáveis), que fornece um mecanismo para execução atômica rápida de operações (se a operação for interrompida por outro thread, o estado é redefinido e uma nova tentativa de execução é feita). A nova versão trouxe a possibilidade de usar em rseq funcionalidades avançadas que estavam faltando no ABI original, como identificadores de execução paralela (mm_cid, memória-mapa ID de concorrência) e identificadores de nó NUMA (node_id).
- Encerrada a suporte ao porto para sistemas big-endian ARC (arceb-linux-gnu).
- Corrigida a vulnerabilidade (CVE-2025-039), que leva a um estouro de buffer ao executar a função assert(). O estouro ocorre quando um nome de programa muito longo é especificado (argv[0]). O problema é considerado não perigoso, pois 4 bytes são escritos além do buffer, cujo conteúdo não pode ser controlado pelo invasor. O ponto interessante é a própria aparição de uma vulnerabilidade nas funções de depuração, que surge devido a um erro na exibição do nome do aplicativo atual.
Fonte: opennet.ru
