Después de seis meses de desarrollo, se publica la versión de la biblioteca del sistema GNU C Library (glibc) 2.41, que cumple completamente con los estándares ISO C11 y POSIX.1-2017. En la creación de esta nueva versión participaron 79 desarrolladores.
Entre las mejoras implementadas en Glibc 2.41 se destacan:
- Se han agregado nuevas funciones sched_setattr y sched_getattr para la plataforma Linux, que permiten establecer/leer los parámetros del planificador de tareas. En la práctica, estas funciones permiten configurar políticas de programación de solicitudes, como SCHED_DEADLINE, que utilizan parámetros adicionales además de la prioridad.
- La utilidad iconv ha añadido soporte para la conversión de codificación en el lugar (si el nombre de los archivos de entrada y salida coinciden, iconv ahora crea automáticamente un archivo temporal y, al finalizar la conversión, reemplaza el archivo original con este).
- Se han agregado funciones trigonométricas al archivo de cabecera math.h, que aparecieron en el estándar C23 (TS 18661-4:2015): acospi, asinpi, atan2pi, atanpi, cospi, sinpi y tanpi.
- Se han trasladado del proyecto CORE-MATH versiones optimizadas y que utilizan un redondeo correcto de funciones como exp10m1f, exp2m1f, expm1f, log10f, log2p1f, log1pf, log10p1f, cbrtf, erff, erfcf, lgammaf, tgammaf, tanf, acosf, acoshf, asinf, asinhf, atanf, atan2f, atanhf, coshf, sinhf y tanhf.
- Se ha añadido soporte para la extensión ARM64 GCS (Guarded Control Stack) para la protección hardware de las direcciones de retorno de funciones y para bloquear exploits que utilizan técnicas de programación orientada al retorno (ROP — Return-Oriented Programming, un exploit se forma a partir de fragmentos existentes de instrucciones de máquina, que finalizan con una instrucción de retorno). ARM64 GCS permite utilizar la técnica del shadow stack para proteger los procesos en el espacio de usuario: después de transferir el control a la función, el procesador guarda las direcciones de retorno no solo en la pila normal, sino también en una pila sombra separada que no puede ser modificada directamente. Antes de salir de la función, la dirección de retorno se extrae de la pila sombra y se verifica con la dirección de retorno de la pila principal. Para compilar Glibc con soporte para GCS, se requieren al menos las versiones 2.44 de binutils y 15 de GCC.
- Se ha realizado un gran trabajo en la mejora de la generación de código y el aumento del rendimiento de las funciones matemáticas para la arquitectura ARM64/AArch64. Se han implementado optimizaciones utilizando instrucciones vectoriales (SVE, Scalable Vector Extension) y extensiones SIMD (Neon).
- Para sistemas con procesadores ARM64/AArch64, se ha agregado soporte para el mecanismo de Keys de Protección de Memoria, utilizado para restringir el acceso a las páginas de memoria sin modificar la tabla de páginas de memoria.
- Para sistemas con procesadores PowerPC64, se ha agregado soporte para instrucciones extendidas que protegen contra el uso de programación orientada a retroceso en los exploits.
- Se ha agregado un nuevo tipo de arquitectura arch_kind_hygon para los procesadores x86-64 Hygon chinos, construidos sobre tecnologías de AMD.
- Se ha ampliado significativamente el conjunto de pruebas de glibc, con el número de pruebas aumentando de 5408 a 6232 en comparación con la versión anterior.
- Se ha añadido la posibilidad de probar la construcción de glibc utilizando compiladores de C y C++ diferentes a los que se utilizaron para la construcción real. Por ejemplo, ‘configure TEST_CC="gcc-6.4.1" TEST_CXX="g++-6.4.1"‘ y ‘configure TEST_CC="clang" TEST_CXX="clang++"‘.
- En las opciones especificadas en el archivo /etc/resolv.conf y la variable de entorno RES_OPTIONS, se ha implementado la posibilidad de usar el prefijo «-» para limpiar la opción previamente establecida con ese nombre. Por ejemplo, si en el archivo /etc/resolv.conf se indica «options no-aaaa», al iniciar el proceso con la variable de entorno «RES_OPTIONS=-no-aaaa» se cancelará la prohibición de enviar consultas DNS para obtener registros AAAA.
- En el resolutor DNS se ha agregado soporte para la opción «strict-error», en la cual la función getaddrinfo(), si no se especifica explícitamente el tipo de direcciones (AF_UNSPEC), intentará obtener valores de registros A (IPv4) y AAAA (IPv6) desde otro servidor DNS, si la consulta de registro A o AAAA al primer servidor DNS falla. Sin especificar «strict-error», en una situación similar se devolverá la dirección obtenida como resultado de una consulta exitosa, mientras que el valor de la consulta fallida será ignorado. Por ejemplo, si servidor se devolvió el registro «A», pero se produjo un error al consultar el «AAAA», getaddrinfo sin la opción «strict-error» solo devolverá la dirección IPv4, mientras que con la opción «strict-error» intentará repetir las consultas a otro servidor DNS.
- Los datos de codificación, la información sobre tipos de caracteres y las tablas de transliteración se han actualizado para soportar la especificación Unicode 16.0.0.
- Se ha añadido el macro «_ISOC2Y_SOURCE», que permite activar las capacidades definidas en el borrador del estándar C2Y. Estas capacidades también se pueden activar mediante el macro _GNU_SOURCE y a través de las banderas del compilador («gcc -std=gnu2y»).
- Se ha implementado la herramienta benchtest para rastrear el rendimiento de diversas funciones (generalmente matemáticas).
- Se ha añadido la configuración glibc.rtld.execstack, a través de la cual se puede prohibir explícitamente el uso de la pila ejecutable.
- Se ha añadido soporte para el ABI ampliable rseq (secuencias reiniciables), que proporciona un mecanismo para la ejecución atómica rápida de operaciones (en caso de que otra hebra interrumpa la operación, el estado se restablece y se reintenta la ejecución). En la nueva versión se ha añadido la posibilidad de utilizar en rseq capacidades avanzadas que no estaban presentes en el ABI original, como identificadores de ejecución paralela (mm_cid, ID de concurrencia de memoria) e identificadores de nodo NUMA (node_id).
- Se ha descontinuado el soporte para el puerto de sistemas big-endian ARC (arceb-linux-gnu).
- Se ha eliminado la vulnerabilidad (CVE-2025-039) que podría causar un desbordamiento de buffer al ejecutar la función assert(). El desbordamiento se produce al especificar un nombre de programa demasiado largo (argv[0]). El problema se considera no peligroso, ya que se escriben 4 bytes fuera del buffer, cuyo contenido no puede controlar el atacante. Sin embargo, es notable el hecho de que este tipo de vulnerabilidad haya aparecido en funciones de depuración debido a un error al mostrar el nombre de la aplicación actual.
Fuente: opennet.ru
