30.09.2020

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


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

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

  • Добавлен макрос _ISOC2X_SOURCE для включения возможностей, определённых в черновом варианте будущего стандарта ISO C2X. Данные возможности также включаются при использовании макроса _GNU_SOURCE или при сборке в gcc c флагом «-std=gnu2x»;
  • Для определённых в заголовочном файле «math.h» функций, которые округляют свои результаты до типа меньшего размера, в файле «tgmath.h» предложены соответствующие макросы обобщённого типа, как того требуют спецификации TS 18661-1:2014 и TS 18661-3:2015;
  • Добавлена функция pthread_clockjoin_np(), которая ожидает завершения потока с учётом таймаута (если таймаут наступит до завершения, то функция вернёт ошибку). В отличие от pthread_timedjoin_np(), в pthread_clockjoin_np() допускается определение типа таймера для расчёта таймаута — CLOCK_MONOTONIC ( учитывает время проведённое системой в спящем режиме) или CLOCK_REALTIME;
  • В DNS-резолвер добавлена поддержка опции trust-ad в /etc/resolv.conf и флага RES_TRUSTAD в _res.options, при установке которых в DNS-запросах осуществляется передача DNSSEC-флага AD (authenticated data). В данном режиме установленный сервером AD-флаг становится доступен приложениям, вызывающим функции, подобные res_search(). По умолчанию, если предложенные опции не выставлены, glibc не выставляет флаг AD в запросах и автоматически очищает его в ответах, что свидетельствует об отсутствии проверки DNSSEC;
  • Для сборки работающих обвязок системных вызовов для Glibc теперь не требуется установка заголовочных файлов ядра Linux. Исключение составляет 64-разрядная архитектура RISC-V;
  • Устранена уязвимость CVE-2019-19126, которая позволяет обойти защиту ASLR в программах с флагом setuid и определить раскладку адресов в загружаемых библиотеках через манипуляцию с переменной окружения LD_PREFER_MAP_32BIT_EXEC.

Изменения, нарушающие совместимость:

  • В totalorder(), totalordermag() и подобные функции для других типов с плавающей запятой, теперь принимают в качестве аргумента указатели для исключения предупреждений о преобразовании значений в состоянии NaN, в соответствии с рекомендациями TS 18661-1, предложенными для будущего стандарта C2X. Существующие исполняемые файлы, в которых аргументы с плавающей точкой передаются напрямую, продолжат работать без изменения;
  • Давно объявленная устаревшая функция stime теперь недоступна для связываемых с glibc бинарных файлов, а её определение удалено из time.h. Для установки системного времени следует использовать функцию clock_settime. В дальнейшем планируется удалить и помеченную устаревшей функцию ftime, а также заголовочный файл sys/timeb.h (вместо ftime следует использовать gettimeofday или clock_gettime);
  • Функция gettimeofday отныне не передаёт сведения о общесистемном часовом поясе (данная возможность была актуальна во времена 4.2-BSD и много лет объявлена устаревшей). При вызове gettimeofday с ненулевым аргументом ‘tzp’ будут возвращены пустые поля tz_minuteswest и tz_dsttime в структуре timezone. В ‘tzp’ теперь следует передавать нулевой указатель, а для получения сведений о часовом поясе в привязке к текущему времени использовать функцию localtime(). Сама функция gettimeofday считается устаревшей в POSIX (вместо gettimeofday рекомендуется использовать clock_gettime). но удалять её из glibc не планируется;
  • В settimeofday прекращена поддержка одновременной передачи параметров для установки времени и смещения. При вызове settimeofday один из аргументов (время или смещение) теперь обязательно должен быть выставлен в значение null, иначе вызов функции будет завершён ошибкой EINVAL. Как и gettimeofday функция settimeofday считается устаревшей в POSIX и вместо неё рекомендуется использовать функцию clock_settime или семейство функций adjtime;
  • Прекращена поддержка архитектуры SPARC ISA v7 (поддержка v8 пока сохранена, но только для процессоров с поддержкой инструкций CAS, таких как процессоры LEON, но не процессоры SuperSPARC).
  • В случает сбоя связывания в режиме «lazy«, при котором компоновщик не выполняет поиск символов для организации вызова функции до первого обращения к функции, функция dlopen теперь принудительно завершает выполнение процесса (ранее при сбое возвращался NULL);
  • Для ABI MIPS hard-float теперь используется исполняемый стек, если при сборке явно не задано ограничение на использование ядра Linux 4.8+ через параметр «—enable-kernel=4.8.0» (с ядрами до 4.8 наблюдаются сбои для некоторых конфигураций MIPS);
  • Обвязки над системными вызовами, связанными с манипуляцией временем, переведены на применение системного вызова time64, при его наличии (на 32-разрядных системах glibc вначале пытается использовать новые системные вызовы, манипулирующие 64-разрядными типами времени, а если их нет, откатывается на старые 32-разрядные вызовы).

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

Добавить комментарий