Выпуск системной библиотеки 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 байта, содержимое которых не может контролировать атакующий.



Источник: http://www.opennet.ru/opennews/art.shtml? num=62633

© OpenNet