Выпуск системной библиотеки Glibc 2.42 и набора утилит GNU Binutils 2.45

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

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

  • В функцию pthread_create добавлена поддержка легковесных сторожевых страниц для защиты стека (stack guard page), обращение к которым вызывает исключение и аварийное завершение процесса (SIGSEGV). Реализация основана на появившемся в системном вызове madviseфлаге MADV_GUARD_INSTALL, поддерживаемом начиная с ядра Linux 6.13. По сравнению с маппингом в режиме PROT_NONE сторожевые страницы позволяют более эффективно блокировать выполнение кода за пределами выделенной области памяти, так как их создание не требует выделения новой области виртуальной памяти.
  • Добавлены и отражены в заголовочном файле math.h новые функции возведения в степень и вычислений корней compoundn, pown и powr, rootn и rsqrt, определённых в стандарте ISO C23. Варианты функций реализованы для типов float, double, long double, _FloatN и _FloatNx, а также для обобщённого типа из tgmath.h.
  • На платформе Linux реализована функция pthread_gettid_np, которая как и функция gettid() возвращает уникальный идентификатор потока, но отличается расширенной проверкой ошибок (при возникновении неопределённого поведения процесс завершается).
  • Добавлены функции для вычисления абсолютных значений, работающие с беззнаковыми типами: uabs, ulabs, ullabs и uimaxabs. Данные функции войдут в состав будущего стандарта Си.
  • На платформе Linux в программном интерфейсе termios.h реализована поддержка произвольных значений скорости передачи. Тип speed_t переопределён и теперь соответствует типу “unsigned int”, как в ядре Linux.
  • В локальный для потоков кэш (tcache), используемый в функции malloc, добавлена поддержка кэширования больших блоков памяти.
    Максимальный размер блока может быть переопределён через настройку glibc.malloc.tcache_max, которая может принимать значения вплоть до 4194304. Ускорена работа кэша для блоков небольшого размера.
  • В сборочный скрипт configure добавлена опция “–enable-sframe”, включающая поддержку формата SFrame, применяемого для представления информации о трассировке стека и поддерживаемого функцией backtrace. Для использования SFrame требуется как минимум версия binutils 2.45.
  • Из проекта CORE-MATH перенесены оптимизированные варианты математических функций acospif, asinpif, atanpif, atan2pif, cospif, sinpif и tanpif.
  • Значительно расширен тестовый набор, который теперь охватывает работу различных вариантов семейств функций printf и scanf.
  • Добавлен код для определения процессоров Intel на базе микроархитектуры Arrow Lake, Panther Lake, Clearwater Forest и Diamond Rapids.
  • Добавлена поддержка платформы z17 (новое поколение мейнфреймов IBM Z/S390).
  • В настройку glibc.rtld.execstack добавлена поддержка режима совместимости для поддержки программ, требующих исполняемого стека через динамически загружаемые библиотеки.
  • Удалены заголовочный файл termio.h и определение структуры termio из sys/ioctl.h. Программный интерфейс termio.h объявлен устаревшим ещё в POSIX.1 (1988 год) и заменён на termios.h.
  • Для сборки Glibc теперь требуются как минимум выпуски GCC 12.1 и GNU Binutils 2.39.
  • Устранены уязвимости:
    • CVE-2025-0395 – переполнение буфера при выполнении функции assert(). Переполнение возникает при указании слишком большого имени программы (argv[0]). Проблема рассматривается как неопасная, так как за пределы буфера записывается 4 байта, содержимое которых не может контролировать атакующий. При этом интересен сам факт появления в отладочных функциях уязвимости, возникающей из-за ошибки при выводе имени текущего приложения.
    • CVE-2025-5702, CVE-2025-5745 – уязвимости в реализации функций strcmp и strncmp для процессоров Power10, приводящие к сбою при сохранении и восстановлении векторных регистров v20-v31, которые должны сохраняться между вызовами функций. Уязвимость может использоваться для перезаписи или определения содержимого данных регистров, исопльзуемых дугой функцией.
    • CVE-2025-8058 – уязвимость в функции regcomp, приводящая к двойному освобождению памяти (double-free).

Дополнительно можно отметить выпуск набора системных утилит GNU Binutils 2.45, в состав которого входят такие программы, как GNU linker, GNU assembler, nm, objdump, strings, strip.

В новой версии Binutils:

  • В GNU assembler:
    • Добавлена поддержка последних расширений для архитектур RISC-V, LoongArch и AArch64. Для x86 добавлена поддержка инструкций XMODX, реализованных в процессорах Zhaoxin PadLock. Для RISC-V добавлена поддержка инструкций ssqosid v1.0, ssnpm v1.0, smnpm v1.0, smmpm v1.0, sspm v1.0, supm v1.0, sha v1.0, zce v1.0, smcdeleg v1.0, ssccfg v1.0, svvptc v1.0, zilsd v1.0, zclsd v1.0, smrnmi v1.0, xtheadvdot v1.0, xmipscbop v1.0, xmipscmov v1.0, xmipsexectl v1.0 и xmipslsp v1.0.
    • Обеспечена совместимость генерации данных в формате SFrame со спецификацией SFrame V2. Добавлена поддержка генерации информации о трассировке стека (.sframe) из директив CFI на 64-разрядных системах s390 (s390x).
    • Добавлена поддержка директив .errif и .warnif для вывода диагностических сообщений при срабатывании определённых условий.
  • В компоновщик в опции “–stats” реализована поддержка опционального аргумента, через который можно указать имя файла для сохранения информации о потреблении ресурсов на разных стадиях компоновки. Имя файла также можно указать через переменную окружения LD_STATS. Для систем RISC-V добавлена поддержка новых форматов PLT.
  • Внесены разнообразные улучшения, связанные с поддержкой формата SFrame. Функции для работы с SFrame вынесены в версионированную библиотеку libsframe.so.2.
  • В дизассемблере и утилите readelf расширена поддержка архитектуры RISC-V.
Release. Ссылка here.