Wydanie biblioteki systemowej Glibc 2.31

Po sześciu miesiącach rozwoju opublikowany wydanie biblioteki systemowej Biblioteka GNU C (glibc) 2.31, który jest w pełni zgodny z wymaganiami norm ISO C11 i POSIX.1-2008. Nowa wersja zawiera poprawki od 58 programistów.

Zaimplementowano w Glibc 2.31 ulepszenia możesz zauważyć:

  • Dodano makro _ISOC2X_SOURCE, aby włączyć możliwości zdefiniowane w projekcie przyszłej normy ISO C2X. Te funkcje są również włączone podczas używania makra _GNU_SOURCE lub podczas budowania w gcc z flagą „-std=gnu2x”;
  • W przypadku funkcji zdefiniowanych w pliku nagłówkowym „math.h”, które zaokrąglają swoje wyniki do mniejszego typu, odpowiednie makra typu ogólnego są proponowane w pliku „tgmath.h”, zgodnie z wymaganiami specyfikacji TS 18661-1:2014 i TS 18661-3: 2015;
  • Dodano funkcję pthread_clockjoin_np(), która czeka na zakończenie wątku, biorąc pod uwagę przekroczenie limitu czasu (jeśli timeout nastąpi przed zakończeniem, funkcja zwróci błąd). w odróżnieniu pthread_timedjoin_np(), w pthread_clockjoin_np() można zdefiniować typ timera do obliczania timeoutu - CLOCK_MONOTONIC (uwzględnia czas przebywania systemu w trybie uśpienia) lub CLOCK_REALTIME;
  • Narzędzie rozpoznawania nazw DNS obsługuje teraz opcję trust-ad w pliku /etc/resolv.conf i flagę RES_TRUSTAD w pliku _res.options. Po ustawieniu flaga DNSSEC jest przesyłana w żądaniach DNS AD (dane uwierzytelnione). W tym trybie flaga AD ustawiona przez serwer staje się dostępna dla aplikacji wywołujących funkcje takie jak res_search(). Domyślnie, jeśli sugerowane opcje nie są ustawione, glibc nie określa flagi AD w żądaniach i automatycznie czyści ją w odpowiedziach, wskazując, że brakuje kontroli DNSSEC;
  • Budowanie działających powiązań wywołań systemowych dla Glibc nie wymaga już instalowania plików nagłówkowych jądra Linuksa. Wyjątkiem jest 64-bitowa architektura RISC-V;
  • Wyłączony słaby punkt CVE-2019-19126, co pozwala ominąć ochronę
    ASLR w programach z flagą setuid i określa układ adresów w załadowanych bibliotekach poprzez manipulację zmienną środowiskową LD_PREFER_MAP_32BIT_EXEC.

Zmiany psujące kompatybilność:

  • totalorder(), totalordermag() i podobne funkcje dla innych typów zmiennoprzecinkowych akceptują teraz wskaźniki jako argumenty, aby wyeliminować ostrzeżenia o konwersji wartości w stanie NaN, zgodnie z zaleceniami TS 18661-1 zaproponowanymi dla przyszłego standardu C2X.
    Istniejące pliki wykonywalne, które bezpośrednio przekazują argumenty zmiennoprzecinkowe, będą nadal działać bez modyfikacji;

  • Długo przestarzała funkcja stime nie jest już dostępna dla plików binarnych powiązanych z glibc, a jej definicja została usunięta z time.h. Aby ustawić czas systemowy, użyj funkcji clock_settime. W przyszłości planujemy usunąć przestarzałą funkcję ftime, a także plik nagłówkowy sys/timeb.h (zamiast ftime należy użyć gettimeofday lub clock_gettime);
  • Funkcja gettimeofday nie przekazuje już informacji o ogólnosystemowej strefie czasowej (ta funkcja była istotna w czasach 4.2-BSD i była przestarzała przez wiele lat). Do argumentu „tzp” należy teraz przekazać wskaźnik zerowy, a do uzyskania informacji o strefie czasowej na podstawie bieżącego czasu należy użyć funkcji localtime(). Wywołanie gettimeofday z niezerowym argumentem „tzp” zwróci puste pola tz_minutywest i tz_dsttime w strukturze strefy czasowej. Sama funkcja gettimeofday jest przestarzała w systemie POSIX (zaleca się clock_gettime zamiast gettimeofday), ale nie planuje się jej usuwania z glibc;
  • settimeofday nie obsługuje już jednoczesnego przekazywania parametrów ustawiania czasu i przesunięcia czasu korygującego. Podczas wywoływania settimeofday jeden z argumentów (czas lub przesunięcie) musi teraz być ustawiony na null, w przeciwnym razie wywołanie funkcji zakończy się niepowodzeniem i błędem EINVAL. Podobnie jak gettimeofday, funkcja settimeofday jest przestarzała w systemie POSIX i zaleca się jej zastąpienie funkcją clock_settime lub rodziną funkcji adjtime;
  • Zakończono obsługę architektury SPARC ISA v7 (na razie zachowano obsługę wersji 8, ale tylko dla procesorów obsługujących instrukcje CAS, takich jak procesory LEON, a nie procesory SuperSPARC).
  • Jeśli parowanie nie powiedzie się w „leniwy", w którym linker nie szuka symboli funkcji aż do pierwszego wywołania tej funkcji, funkcja dlopen wymusza teraz zakończenie procesu (wcześniej zwracała NULL w przypadku niepowodzenia);
  • W przypadku interfejsu ABI typu hard-float MIPS używany jest teraz stos wykonywalny, chyba że kompilacja wyraźnie ogranicza użycie jądra Linuksa 4.8+ za pomocą parametru „-enable-kernel=4.8.0” (w przypadku jąder w wersji do 4.8 awarie są obserwowane dla niektórych konfiguracji MIPS);
  • Powiązania wokół wywołań systemowych związanych z manipulacją czasem zostały przeniesione tak, aby korzystały z wywołania systemowego time64, jeśli jest obecne (w systemach 32-bitowych glibc najpierw próbuje nowych wywołań systemowych, które manipulują 64-bitowym typem czasu, a jeśli ich nie ma, kończy się powrót do starych połączeń 32-bitowych).

Źródło: opennet.ru

Dodaj komentarz