След шест месеца разработка релиз на системната библиотека (glibc) , който изцяло отговаря на изискванията на стандартите ISO C11 и POSIX.1-2008. Новото издание включва корекции от 58 разработчици.
От реализираните в Glibc 2.31 можем да отбележим:
- Добавен е макрос _ISOC2X_SOURCE за включване на възможностите, определени в черновата версия на бъдещия стандарт ISO . Тези възможности също се включват при използване на макроса _GNU_SOURCE или при компилиране с gcc с флага «-std=gnu2x»;
- За функциите, определени в заглавния файл «math.h», които закръглят резултатите си до по-малък тип, в файла «tgmath.h» са предложени съответни макроси за обобщен тип, както изискват спецификациите TS 18661-1:2014 и TS 18661-3:2015;
- Добавена е функцията pthread_clockjoin_np(), която изчаква завършването на поток с оглед на таймаута (ако таймаутът настъпи преди завършването, функцията ще върне грешка). За разлика от , в pthread_clockjoin_np() е позволено определяне на типа таймер за изчисляване на таймаута — CLOCK_MONOTONIC (взима предвид времето, прекарано от системата в режим на сън) или CLOCK_REALTIME;
- В DNS резолвера е добавена поддръжка на опцията trust-ad в /etc/resolv.conf и флага RES_TRUSTAD в _res.options, при задаване на които в DNS заявките се предава DNSSEC флага (authenticated data). В този режим зададеният от сървъра AD флаг става достъпен за приложенията, извикващи функции, подобни на res_search(). По подразбиране, ако предложените опции не са зададени, glibc не указва AD флага в заявките и автоматично го изчиства в отговорите, което свидетелства за липсата на проверка на DNSSEC;
- За изграждане на работещи обвивки на системни повиквания за Glibc вече не е необходимо инсталиране на заглавни файлове на ядрото на Linux. Изключение прави 64-битовата архитектура RISC-V;
- Отстранена , който позволява заобикаляне на защитата
ASLR в програми с флага setuid и определяне на разпределението на адресите в зарежданите библиотеки чрез манипулации с променливата на средата LD_PREFER_MAP_32BIT_EXEC.
Промени, нарушаващи съвместимостта:
- В totalorder(), totalordermag() и подобни функции за други типове с плаваща запетая сега приемат указатели като аргумент, за да се избегнат предупреждения за преобразуване на стойности в състояние , в съответствие с препоръките на TS 18661-1, предложени за бъдещия стандарт C2X.
Съществуващите изпълними файлове, в които аргументите с плаваща запетая се предават директно, ще продължат да работят без промяна; - Отдавна обявената остаряла функция stime вече не е налична за свързаните с glibc бинарни файлове, а нейното определение е премахнато от time.h. За настройка на системното време следва да се използва функцията clock_settime. В бъдеще се планира да бъде премахната и остарялата функция ftime, както и заглавният файл sys/timeb.h (вместо ftime следва да се използва gettimeofday или clock_gettime);
- Функцията gettimeofday вече не предава информация за общата часова зона на системата (тази възможност беше актуална по времето на 4.2-BSD и много години беше обявена за остаряла). В аргумента 'tzp' сега следва да се предаде нулев указател, а за получаване на информация за часовата зона, свързана с текущото време, да се използва функцията localtime(). При извикване на gettimeofday с ненулев аргумент 'tzp' ще се върнат празни полета tz_minuteswest и tz_dsttime в структурата timezone. Самата функция gettimeofday се счита за остаряла в POSIX (вместо gettimeofday се препоръчва да се използва clock_gettime), но нейното премахване от glibc не е планирано;
- В settimeofday е прекратена поддръжката на едновременно предаване на параметри за настройка на времето и коригиране на времевото смещение. При извикване на settimeofday един от аргументите (време или смещение) сега задължително трябва да бъде зададен на null, в противен случай извикването на функцията ще завърши с грешка EINVAL. Както gettimeofday, функцията settimeofday също се счита за остаряла в POSIX и вместо нея се препоръчва да се използват функцията clock_settime или семейството функции adjtime;
- Поддръжката на архитектурата SPARC ISA v7 е спряна (поддръжката на v8 все още остава, но само за процесори с поддръжка на инструкции CAS, като процесорите LEON, а не процесорите SuperSPARC).
- В случай на грешка при свързването в режим '', при който компоновчикът не извършва търсене на символите на функцията до първото й извикване, функцията dlopen сега принудително завършва изпълнението на процеса (по-рано при грешка се връщаше NULL);
- За ABI MIPS hard-float сега се използва изпълняем стек, освен ако при компилация не е зададена явно границата за използване на ядрото Linux 4.8+ чрез параметъра '--enable-kernel=4.8.0' (с ядра до 4.8 се наблюдават сривове за някои конфигурации MIPS);
- Обвързванията около системните повиквания, свързани с манипулирането на времето, са прехвърлени на използването на системното повикване time64, ако е налично (на 32-битови системи glibc първоначално се опитва да използва новите системни повиквания, манипулиращи 64-битов тип за време, а ако те не са налични, се връща към старите 32-битови повиквания).
Източник: opennet.ru
