Po sześciu miesiącach rozwoju wydanie biblioteki systemowej (glibc) , który w pełni spełnia wymagania standardów ISO C11 i POSIX.1-2008. Nowa wersja zawiera poprawki od 58 deweloperów.
Zrealizowanych w Glibc 2.31 można wymienić:
- Dodano makro _ISOC2X_SOURCE w celu włączenia funkcji określonych w roboczej wersji przyszłego standardu ISO . Te możliwości są również włączane przy użyciu makra _GNU_SOURCE lub podczas kompilacji w gcc z flagą „-std=gnu2x”;
- Dla funkcji zdefiniowanych w pliku nagłówkowym „math.h”, które zaokrąglają swoje wyniki do typu mniejszego rozmiaru, w pliku „tgmath.h” zaproponowano odpowiednie makra typu ogólnego, jak wymagają specyfikacje TS 18661-1:2014 i TS 18661-3:2015;
- Dodano funkcję pthread_clockjoin_np(), która oczekuje na zakończenie wątku z uwzględnieniem timeoutu (jeśli timeout nastąpi przed zakończeniem, funkcja zwróci błąd). W przeciwieństwie do , w pthread_clockjoin_np() możliwe jest określenie rodzaju timera do obliczenia timeoutu — CLOCK_MONOTONIC (uwzględnia czas spędzony przez system w trybie uśpienia) lub CLOCK_REALTIME;
- Do rozwiązywacza DNS dodano obsługę opcji trust-ad w /etc/resolv.conf oraz flagi RES_TRUSTAD w _res.options, które po ustawieniu umożliwiają przesyłanie flagi DNSSEC w zapytaniach DNS (dane uwierzytelnione). W tym trybie ustawiona przez serwer flaga AD staje się dostępna dla aplikacji wywołujących funkcje, podobne do res_search(). Domyślnie, jeśli zaproponowane opcje nie są ustawione, glibc nie wskazuje flagi AD w zapytaniach i automatycznie ją oczyszcza w odpowiedziach, co wskazuje na brak weryfikacji DNSSEC;
- Do budowy działających powiązań wywołań systemowych dla Glibc nie jest już wymagana instalacja plików nagłówkowych jądra Linux. Wyjątek stanowi 64-bitowa architektura RISC-V;
- Usunięto , która umożliwia ominięcie ochrony
ASLR w programach z flagą setuid i określenie rozkładu adresów w załadowanych bibliotekach poprzez manipulację zmienną środowiskową LD_PREFER_MAP_32BIT_EXEC.
Zmiany naruszające zgodność:
- W totalorder(), totalordermag() i podobnych funkcjach dla innych typów z przecinkiem dziesiętnym teraz przyjmują jako argument wskaźniki, aby uniknąć ostrzeżeń o konwersji wartości w stanie , zgodnie z zaleceniami TS 18661-1, zaproponowanymi dla przyszłego standardu C2X.
Istniejące pliki wykonywalne, w których argumenty z przecinkiem dziesiętnym są przekazywane bezpośrednio, będą działać bez zmian; - Długo zapowiadana przestarzała funkcja stime jest teraz niedostępna dla binarnych plików powiązanych z glibc, a jej definicja została usunięta z time.h. Do ustawiania czasu systemowego należy używać funkcji clock_settime. W przyszłości planowane jest usunięcie także przestarzałej funkcji ftime oraz nagłówka sys/timeb.h (zamiast ftime należy używać gettimeofday lub clock_gettime);
- Funkcja gettimeofday nie przekazuje już informacji o ogólnym strefie czasowej systemu (ta możliwość była aktualna w czasach 4.2-BSD i wiele lat temu została ogłoszona przestarzałą). Argument 'tzp' powinien teraz być przekazywany jako wskaźnik null, a aby uzyskać informacje o strefie czasowej w związku z aktualnym czasem, należy używać funkcji localtime(). Przy wywołaniu gettimeofday z niezerowym argumentem 'tzp', pola tz_minuteswest i tz_dsttime w strukturze timezone będą zwracać puste wartości. Sama funkcja gettimeofday jest uznawana za przestarzałą w POSIX (zamiast gettimeofday zaleca się użycie clock_gettime), ale nie planuje się jej usunięcia z glibc;
- W settimeofday zakończono wsparcie dla jednoczesnego przekazywania parametrów do ustawienia czasu i przesunięcia czasowego. Podczas wywołania settimeofday jeden z argumentów (czas lub przesunięcie) musi teraz być ustawiony na wartość null, w przeciwnym razie wywołanie funkcji zakończy się błędem EINVAL. Podobnie jak gettimeofday, funkcja settimeofday jest uznawana za przestarzałą w POSIX i zamiast niej zaleca się użycie funkcji clock_settime lub rodziny funkcji adjtime;
- Zaprzestano wsparcia dla architektury SPARC ISA v7 (wsparcie v8 wciąż jest zachowane, ale tylko dla procesorów obsługujących instrukcje CAS, takich jak procesory LEON, a nie procesory SuperSPARC).
- W przypadku awarii wiązania w trybie „«, w którym linker nie wykonuje poszukiwań symboli funkcji do pierwszego wywołania tej funkcji, funkcja dlopen teraz wymusza zakończenie działania procesu (wcześniej w przypadku błędu zwracano NULL);
- Dla ABI MIPS hard-float teraz używany jest stos wykonywalny, chyba że podczas kompilacji wyraźnie ustawiono ograniczenie na użycie jądra Linux 4.8+ za pomocą parametru „—enable-kernel=4.8.0” (w przypadku jąder do 4.8 występują awarie w niektórych konfiguracjach MIPS);
- Obwody wokół wywołań systemowych związanych z manipulacją czasem zostały przetłumaczone na użycie wywołania systemowego time64, o ile jest dostępne (na systemach 32-bitowych glibc najpierw próbuje używać nowych wywołań systemowych manipulujących 64-bitowym typem czasu, a jeśli ich nie ma, cofa się do starych 32-bitowych wywołań).
Źródło: opennet.ru
