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

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

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

  • Обеспечена возможность сборки и запуска на системах GNU/Hurd без применения дополнительных патчей;
  • Добавлена функция renameat2, предоставляющая средства для атомарной замены имён двух файлов (первый файл переименовывается во второй, а второй в первый). Функция renameat2 отличается от renameat наличием дополнительного флагового поля. Если флаг не указан поведение renameat2 полностью аналогично renameat. Из флагов поддерживается RENAME_NOREPLACE, при котором операция переименования не приводит к замене уже существующего файла. В случае, если ядро не поддерживает системный вызов renameat2 и при вызове указаны аргументы, будет возвращена ошибка;
  • Добавлена функция statx, которая отличается от fstatat64 наличием дополнительного флагового аргумента. В случае, если ядро не поддерживает системный вызов statx, возвращающего расширенную информацию о файле, включая время создания файла и специфичные для файловых систем флаги, в glibc предоставляется базовая поддержка на основе функции fstatat64;
  • Добавлена поддержка потоков ISO C (threads.h), определённых в спецификации ISO/IEC 9899:2011). Для использования потоков в приложениях необходимо связывание с libpthread. В многопоточных программах можно использовать следующие функции:
    • thrd_current, thrd_equal, thrd_sleep, thrd_yield, thrd_create, thrd_detach, thrd_exit и thrd_join для управления потоками;
    • mtx_init, mtx_lock, mtx_timedlock, mtx_trylock, mtx_unlock, and mtx_destroy для управления мьютексами;
    • call_once для синхронизации вызова функций;
    • cnd_broadcast, cnd_destroy, cnd_init, cnd_signal, cnd_timedwait и cnd_wait для условных переменных;
    • tss_create, tss_delete, tss_get и tss_set для TLS (thread-local storage).
  • Данные локализации обновлены до свежей четвёртой редакции стандарта ISO 14651 для полного соответствия с Unicode 9.0.0. Для многих локалей добавлены новые свойства «Collation», позволяющие задавать правила сортировки и методы сопоставления с учётом смысла символов. Включение данной информации привело к увеличению размера скомпилированных файлов с локалями;
  • При сборке обеспечена поддержка технологии Intel CET (Control-flow Enforcement Technology). При указании сборочной опции »--enable-cet» осуществляется включение для исполняемого кода защиты с использованием инструкций IBT (indirect branch tracking) и SHSTK (shadow stack), при этом сохраняется совместимость со всеми существующими исполняемыми файлами и библиотеками. Новый режим сборки доступен для архитектур i386, x86_64 и x32 при сборке с GCC 8 и наличии binutils 2.29;
  • Добавлена корректная поддержка символов ABSOLUTE (SHN_ABS), поддерживаемых компоновщиком GNU linker;
  • Кодировки, информация о типах символов и таблицы транслитерации обновлены для поддержки спецификации Unicode 11.0.0;
  • Добавлены новые варианты математических функций, определённых в заголовочном файле math.h, которые округляют результат до типа narrower, определённого в спецификациях TS 18661–1:2014 и TS 18661–3:2015:
    • fadd, faddl, daddl и соответствующие им fMaddfN, fMaddfNx, fMxaddfN и fMxaddfNx;
    • fsub, fsubl, dsubl и соответствующие им fMsubfN, fMsubfNx, fMxsubfN and fMxsubfNx;
    • fmul, fmull, dmull и соответствующие им fMmulfN, fMmulfNx, fMxmulfN and fMxmulfNx;
    • fdiv, fdivl, ddivl и соответствующие им fMdivfN, fMdivfNx, fMxdivfN and fMxdivfNx;
  • Добавлена локаль для якутского языка Yakut (sah_RU), в которой обеспечена поддержка двух разных грамматических форм имён месяцев;
  • Для обработки интернационализированных доменных имён в функциях getaddrinfo и getnameinfo теперь используется система libidn2, при наличии соответствующей библиотеки. В случае отсутствия библиотеки libidn2 кодирование и декодирование интернационализированных имён не производится, даже при указании флагов AI_IDN и NI_IDN (указание не ASCII-символов приведёт к возврату ошибки). Ранее применяемые флаги AI_IDN_ALLOW_UNASSIGNED, AI_IDN_USE_STD3_ASCII_RULES, NI_IDN_ALLOW_UNASSIGNED, NI_IDN_USE_STD3_ASCII_RULES объявлены устаревшими и игнорируются;
  • При разборе динамических строковых токенов в DT_RPATH, DT_RUNPATH, DT_NEEDED, DT_AUXILIARY и DT_FILTER обеспечена поддержка всех выражений ELF gABI, включая конструкции '$ORIGIN$ORIGIN'. Для приложений с флагом SUID/GUID применение выражений ограничено и динамические строки интерпретируются как строковые литералы;
  • Прекращена поставка устаревших заголовочных файлов libio.h и _G_config.h, функциональность которых предоставляется в stdio.h;
  • Функции 'getc' и 'putc' теперь не определены в форме макросов, а реализованы через вызов (f)getc_unlocked и (f)putc_unlocked;
  • Во всех функциях stdio изменено поведение при обработке конца файла в случае добавления данных после открытия файла (для для чтения добавленных данных требуется вызов clearerr или функций вида fseek и rewind);
  • Макросы 'major', 'minor' и 'makedev' теперь доступны только при подключении заголовочного файла sys/sysmacros.h (загрузки sys/types.h недостаточно);
  • Прекращена поддержка конфигураций tilegx*-*-linux-gnu;

© OpenNet