Выпуск системной библиотеки 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