Выпуск системной библиотеки Glibc 2.41

После шести месяцев разработки опубликован релиз системной библиотеки GNU C Library (glibc) 2.41, которая полностью следует требованиям стандартов ISO C11 и POSIX.1-2017. В состав нового выпуска включены исправления от 68 разработчиков.

Из реализованных в Glibc 2.41 улучшений можно отметить:

  • Для платформы Linux добавлены новые функции sched_setattr и sched_getattr, через которые можно передавать параметры планировщику задач и определять выставленные параметры. На практике функции дают возможность настраивать политики планирования запросов, такие как SCHED_DEADLINE, в которых используются дополнительные параметры, помимо приоритета.
  • В утилиту iconv добавлена поддержка преобразования кодировки по месту (т.е. если имя входного и выходного файлов совпадают, iconv теперь автоматически создаёт временный файл и после завершения преобразования заменяет им исходный файл).
  • В заголовочный файл math.h добавлены тригонометрические функции, появившиеся в стандарте C23 (TS 18661-4:2015): acospi, asinpi, atan2pi, atanpi, cospi, sinpi и tanpi.
  • Из проекта CORE-MATH перенесены оптимизированные и использующие правильное округление варианты функций exp10m1f, exp2m1f, expm1f, log10f, log2p1f, log1pf, log10p1f, cbrtf, erff, erfcf, lgammaf, tgammaf, tanf, acosf, acoshf, asinf, asinhf, atanf, atan2f, atanhf, coshf, sinhf и tanhf.
  • Добавлена поддержка расширения ARM64 GCS (Guarded Control Stack) для аппаратной защиты адресов возврата из функций и блокирования эксплоитов, использующих методы возвратно-ориентированного программирования (ROP – Return-Oriented Programming, эксплоит формируется из уже имеющихся кусков машинных инструкций, завершающихся инструкцией возврата управления). ARM64 GCS позволяет использовать для защиты процессов в пространстве пользователя технику теневого стека (shadow stack) – после передачи управления функции, адреса возврата сохраняются процессором не только в обычном стеке, но и в отдельном теневом стеке, который не может быть изменён напрямую. Перед выходом из функции адрес возврата извлекается из теневого стека и сверяется с адресом возврата из основного стека. Для сборки Glibc с поддержкой GCS требуется наличие как минимум версий binutils 2.44 и GCC 15.
  • Проведена большая работа по улучшению генерации кода и повышению производительности математических функций для архитектуры ARM64/AArch64. Реализованы оптимизации с использованием векторных инструкций (SVE, Scalable Vector Extension) и SIMD-расширений (Neon).
  • Для систем с процессорами ARM64/AArch64 добавлена начальная поддержка механизма Memory Protection Keys, применяемого для ограничения доступа к страницам памяти без изменения таблицы страниц памяти.
  • Для систем с процессорами PowerPC64 добавлена поддержка расширенных инструкций для защиты от использования возвратно-ориентированного программирования в эксплоитах.
  • Добавлен новый тип архитектуры для китайских x86-64 процессоров Hygon, построенных на основе технологий AMD.
  • Значительно расширен набор для тестирования glibc, число тестов в котором по сравнению с прошлым выпуском увеличено с 5408 до 6232.
  • Добавлена возможность тестирования сборки glibc с использованием компиляторов C и C++, отличных от тех, что использованы для фактической сборки. Например, ‘configure TEST_CC=”gcc-6.4.1″ TEST_CXX=”g++-6.4.1″‘ и ‘configure TEST_CC=”clang” TEST_CXX=”clang++”‘.
  • Во опциях, указываемых в файле /etc/resolv.conf и переменной окружения RES_OPTIONS, реализована возможность использования префикса “-” для очистки ранее выставленной опции с данным именем. Например, если в файле /etc/resolv.conf указано “options no-aaaa”, то при запуске процесса с переменной окружения “RES_OPTIONS=-no-aaaa” будет отменён запрет на отправку DNS-запросов для получения записи AAAA.
  • В DNS-резолвер добавлена поддержка опции “strict-error”, при которой функция getaddrinfo(), если явно не указан тип адресов (AF_UNSPEC), попытается получить значения записей A (IPv4) и AAAA (IPv6) с другого DNS-сервера, если не один из запросов к первому DNS-серверу (A или AAAA) завершился ошибкой. Без указания “strict-error” в подобной ситуации будет возвращён адрес, полученный в результате успешно обработанного запроса, а значение неудачного запроса будет игнорировано. Например, если сервер вернул запись “A”, но выдал ошибку при запросе “AAAA”, getaddrinfo без опции “strict-error” сразу вернёт только адрес IPv4, а с опцией “strict-error” попытается повторить запросы к другому DNS-серверу.
  • Данные кодировок, информация о типах символов и таблицы транслитерации обновлены для поддержки спецификации Unicode 16.0.0.
  • Добавлен макрос “_ISOC2Y_SOURCE”, позволяющий активировать возможности, определённые в черновике стандарта C2Y. Подобные возможности также можно активировать при помощи макроса _GNU_SOURCE и через флаги компилятора (“gcc -std=gnu2y”).
  • Реализован инструментарий benchtest для отслеживания производительности различных функций (в основном математических).
  • Добавлена настройка glibc.rtld.execstack, через которую можно явно запретить использование исполняемого стека.
  • Добавлена поддержка расширяемого ABI rseq (restartable sequences), предоставляющего механизм для быстрого атомарного выполнения операций, которые в случае прерывания другим потоком очищаются и предпринимается повторная попытка выполнения. В новой версии появилась возможность использования в rseq расширенных возможностей, отсутствующих в изначальном ABI, таких как идентификаторы параллельного выполнения (mm_cid, memory-map concurrency ID) и идентификаторы узла (node_id).
  • Превращена поддержка порта для big-endian систем ARC (arceb-linux-gnu).
  • Устранена уязвимость (CVE-2025-039), приводящая к переполнению буфера при выполнении функции assert() через передачу слишком большого имени процесса (argv[0]). Проблема рассматривается как неопасная, так за пределы буфера записывается 4 байта, содержимое которых не может контролировать атакующий.
Release. Ссылка here.