После шести месяцев разработки состоялся (https://sourceware.org/ml/libc-alpha/2018-02/msg00054.html) релиз системной библиотеки GNU C Library (http://ftp.gnu.org/gnu/glibc/) (glibc) 2.27 (http://sourceware.org/glibc/wiki/Release/2.27), которая полностью следует требованиям стандартов ISO C11 и POSIX.1-2008. В состав нового выпуска включены исправления от 73 разработчиков. Примечательно, что мэйнтейнером выпуска 2.27 (https://sourceware.org/glibc/wiki/Release/2.27) стал (https://sourceware.org/glibc/wiki/Release) Дмитрий Левин, генеральный конструктор ALT Linux.
Из добавленных в Glibc 2.27 улучшений (http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=NEWS;h...) можно отметить:
- Реализованы новые функции memfd_create и mlock2, специфичные для платформы Linux. Функция memfd_create позволяет создавать области маппинга памяти при помощи механизма memfd, при котором область памяти идентифицируется через файловый дескриптор, который может передаваться между процессами (можно выделить память как по malloc, но обращаться к ней как с файлом, по файловому дескриптору). Функция mlock2 расширяет возможности вызова mlock() поддержкой дополнительного аргумента, позволяющего задействовать новый режим блокировки VM_LOCKONFAULT, при котором страницы памяти в указанном диапазоне будут закреплены в ОЗУ не сразу, а только после возникновения page fault (обращение к невыделенным страницам памяти);
- Добавлена поддержка механизма PKU (Memory Protection Keys (https://en.wikipedia.org/wiki/Memory_protection#Protection_keys)), реализованного в серверных моделях процессоров Intel на базе микроархитектуры Skylake для защиты доступа к страницам памяти из пространства пользователя, без изменения таблиц страниц памяти при изменении домена защиты. Для использования данного режима в sys/mman.h добавлены функции pkey_alloc, pkey_free, pkey_mprotect, pkey_set и pkey_get, которые можно использовать для дополнительной защиты размещения в памяти ключей шифрования, предоставив возможность чтения только для одного потока в многопоточной программе шифрования;
- Добавлена функция copy_file_range, позволяющая ускорить выполнение операций копирования данных из одного файла в другой файл с выполнением операции только на стороне ядра, без предварительного чтения данных в память процесса, что избавляет от частого переключения контекста между ядром и пространством пользователя. Тем не менее, в обычных условиях использование copy_file_range лишь немного быстрее обычной команды "cp", так как основное время уходит на ввод/вывод с накопителя;
- Добавлена возможность компиляции Glibc (опция "--enable-static-pie") с поддержкой сборки статически связанных исполняемых файлов в формате PIE. По сравнению с обычными статическими исполняемыми файлами подобные файлы в формате PIE могут быть загружены по любому адресу и предоставляют дополнительные средства защиты, ценой определённого повышения потребления памяти и снижения производительности. При сборки Glibc с опцией "--enable-static-pie" формируется файл libc.a, который можно использовать с компилятором GCC 8, для создания статических файлов PIE при указании опции '-static-pie'. Возможность реализована для архитектур i386, x86_64 и x32 (требуется binutils 2.29), а также aarch64 (требуется binutils 2.30);
- Добавлена поддержка архитектуры RISC-V, которая предоставляет открытую и гибкую систему машинных инструкций, позволяющую создавать микропроцессоры для произвольных областей применения, не требуя при этом отчислений и не налагая условий на использование. RISC-V позволяет создавать полностью открытые SoC и процессоры. Для использования RISC-V также требуется binutils 2.30, gcc 7.3.0 и ядро Linux 4.15;
- Проведена оптимизация кода функций asin, atan2, exp, expf, log, pow, atan, sin, cosf, sinf, sincosf и tan с задействованием набора инструкций FMA (https://en.wikipedia.org/wiki/FMA_instruction_set) (Fused Multiply–Add) на платформе x86-64;
- Проведена оптимизация кода функций trunc и truncf с задействованием инструкций SSE4.1 на платформе x86-64;
- Проведены общие платформонезависимые оптимизации кода функций expf, exp2f, logf, log2f, powf, sinf, cosf и sincosf;
- Проведена оптимизация функций memcpy, mempcpy, memmove и memset для процессоров sparc M7;
- С целью обеспечения более быстрого и безопасного завершения процессов в наборе функций malloc прекращён вывод информации о адресе сбоя и обратной трассировке стека. Целью изменения является минимизация действий, выполняемых после обнаружения выхода за границы диапазонов памяти, чтобы избежать потенциальных уязвимостей в коде обработки данных ситуаций и сократить время завершения работы процесса;
- В функции abort обеспечено мгновенное завершение процессов, без сброса буферов ввода/вывода в stdio, что снижает вероятность повреждения данных после краха и возникновения ситуаций взаимной блокировки;
- В библиотеку математических функций добавлены интерфейсы _Float32, _Float64 и _Float32x в соответствии с требованиями стандарта ISO/IEC TS 18661-3:2015. Для платформ с поддержкой формата IEEE binary128 для типа "long double" (aarch64, alpha, mips64, riscv, s390 и sparc) в библиотеке математических функций также реализованы интерфейсы _Float128 для данного типа;
- В утилите ldconfig при обработке директивы include обеспечена сортировка в соответствии с локалью C/POSIX (ранее использовались правила из текущей локали, что приводило к проблемам);
- Добавлена поддержка двух грамматических форм имён месяцев (например, января и январь). В strftime спецификаторы "%B" и "%b" теперь выводят имена месяца с учётом их грамматической формы в контексте общей даты, а новые спецификаторы %OB" и "%Ob" могут применяться для вывода грамматической формы названия месяца как такового. В функции strptime считаются корректными любые формы имени месяца, обрабатываемые через специфкаторы %B", "%b", "%h", "%OB", "%Ob" и "%Oh". Вызов nl_langinfo выводит форму со склонением при указании флагов MON_1..12 и ABMON_1..12, и нормальную форму при указании флагов ALTMON_1..12 и _NL_ABALTMON_1..12;
- Устаревшая функциональность и изменения, приводящие к нарушению обратной совместимости:
- Изменения в бинарном формате локали не позволяют использовать файлы локали, собранные для Glibc 2.27, в статически скомпилированных приложениях. В этом случае вместо запрошенной локали будет включена локаль C/POSIX, а для корректной загрузки локали требуется перекомпиляция приложения;
- Объявлена устаревшей возможность использования в статически скомпилированных приложениях вызова dlopen. Поддержка таких приложений будет прекращена в следующем выпуске. Для подобных программ следует применять динамическое связывание;
- Объявлена устаревшей и будет прекращена в следующем выпуске поддержка старых программ, в которых используются внутренние структуры данных и функции stdio (_IO_*), в том числе программы C++ использующие класс streams из libstdc++ (GCC 2.95);
- Из заголовочного файла sys/ptrace.h убрано определение константы PTRACE_SEIZE_DEVEL на системах GNU/Linux;
- В libm прекращена поддержка обработчиков ошибок SVID (вызов пользовательской функции matherr при ошибке) и применение переменной _LIB_VERSION для управления обработкой ошибок. Прекращена поставка библиотеки libieee.a. Из заголовочного файла math.h убраны определения макросов X_TLOSS, DOMAIN, SING, OVERFLOW, UNDERFLOW,
TLOSS, PLOSS и HUGE;
- В новых программах прекращена поддержка функций pow10, pow10f и pow10l вместо которых следует использовать exp10, exp10f и
exp10l;
- Прекращена поддержка механизма сборки дополнительных пакетов во время сборки Glibc. Опция "--enable-add-ons" теперь игнорируется;
- Во время сборки теперь не учитывается опция "--without-fp", а задействование аппаратных средств вычислений с плавающей запятой производится на уровне опций компилятора;
- В функции res_hnok, res_dnok, res_mailok и res_ownok добавлена проверка соответствия переданной стоки тре...
URL: https://sourceware.org/ml/libc-alpha/2018-02/msg00054.html
Новость: http://www.opennet.dev/opennews/art.shtml?num=48009