Nach sechs Monaten der Entwicklung wurde die Version der GNU C Library (glibc) 2.36 veröffentlicht, die vollständig den Anforderungen der ISO C11- und POSIX.1-2017-Standards entspricht. Der neue Release enthält Korrekturen von 59 Entwicklern.
Bei den in Glibc 2.36 implementierten Verbesserungen sind folgende hervorzuheben:
- Die Unterstützung für das neue Format relativer Adressverschiebungen DT_RELR (relative relocation) wurde hinzugefügt, das es ermöglicht, die Größe der relativen Verschiebungen in gemeinsam genutzten Objekten und ausführbaren Dateien, die im Modus mit PIE (Position-independent executables) kompiliert sind, zu verringern. Zur Verwendung des Felds DT_RELR in ELF-Dateien ist die Unterstützung der Option "-z pack-relative-relocs" im Linker erforderlich, die in der Version des binutils-Pakets 2.38 eingeführt wurde.
- Für die Linux-Plattform wurden die Funktionen pidfd_open, pidfd_getfd und pidfd_send_signal implementiert, die den Zugriff auf die Funktionalität von pidfd ermöglichen, die hilft, Situationen mit der Wiederverwendung von PIDs besser zu verwalten, um Prozesse, die auf überwachte Dateien zugreifen, genauer zu identifizieren (pidfd wird mit einem bestimmten Prozess verbunden und ändert sich nicht, während die PID nach Abschluss des aktuellen mit dieser PID verknüpften Prozesses an einen anderen Prozess gebunden werden kann).
- Für die Linux-Plattform wurde die Funktion process_madvise() hinzugefügt, die es einem Prozess ermöglicht, den Systemaufruf madvise() im Namen eines anderen Prozesses auszuführen, indem der Zielprozess über pidfd identifiziert wird. Über madvise() kann der Kernel über die Speichereigenschaften informiert werden, um die Speicherverwaltung des Prozesses zu optimieren; beispielsweise kann der Kernel basierend auf den übermittelten Informationen die Freigabe zusätzlicher freier Speicherressourcen initiieren. Der Aufruf von madvise() durch einen anderen Prozess kann erforderlich sein, wenn die für die Optimierung notwendigen Informationen dem aktuellen Prozess nicht bekannt sind und von einem separaten Hintergrundverwaltungsprozess koordiniert werden, der eigenständig die Freigabe ungenutzten Speichers bei Prozessen anstoßen kann.
- Für die Linux-Plattform wurde die Funktion process_mrelease() hinzugefügt, die eine schnellere Freigabe des Speichers für einen Prozess ermöglicht, der seine Ausführung beendet. Unter normalen Bedingungen erfolgt die Freigabe von Ressourcen und das Beenden eines Prozesses nicht sofort und kann aus verschiedenen Gründen verzögert werden, was die Arbeit von im Benutzerraum laufenden Systemen zur frühzeitigen Reaktion auf Speicherknappheit, wie z.B. oomd (bereitgestellt in systemd), stört. Mit dem Aufruf von process_mrelease können solche Systeme vorhersehbarer Speicher von zwangsweise beendeten Prozessen zurückfordern.
- In die integrierte Implementierung des DNS-Resolvers wurde die Unterstützung für die Option „no-aaaa“ hinzugefügt, die es zur vereinfachten Diagnose von Problemen ermöglicht, das Senden von DNS-Anfragen für AAAA-Einträge (Bestimmung der IPv6-Adresse anhand des Hostnamens) abzuschalten, einschließlich der Ausführung von NSS-Funktionen wie getaddrinfo(). Die Option hat keine Auswirkungen auf die Verarbeitung von IPv6-Adressenbindungen, die in /etc/hosts definiert sind, und auf die Aufrufe von getaddrinfo() mit dem AI_PASSIVE-Flag.
- Für die Linux-Plattform wurden die Funktionen fsopen, fsmount, move_mount, fsconfig, fspick, open_tree und mount_setattr hinzugefügt, die Zugriff auf die neue Kernel-API zur Verwaltung der Einbindung von Dateisystemen unter Berücksichtigung der Mount-Namensräume bieten. Die vorgeschlagenen Funktionen ermöglichen es, verschiedene Phasen des Einbindens (Superblock verarbeiten, Informationen über das FS abrufen, einbinden, an den Mount-Punkt anhängen) getrennt zu behandeln, die zuvor mit der allgemeinen Funktion mount() durchgeführt wurden. Separierte Funktionen ermöglichen es, komplexere Einbindungsszenarien durchzuführen und solche Operationen wie das Neuausrichten des Superblocks, das Aktivieren von Optionen, das Ändern des Mount-Punkts und das Verschieben in einen anderen Namensraum separat auszuführen. Darüber hinaus ermöglicht die getrennte Verarbeitung eine präzise Bestimmung der Gründe für die Ausgabe von Fehlercodes und das Festlegen mehrerer Quellen für mehrschichtige Dateisysteme wie overlayfs.
- In localedef wurde die Unterstützung für die Verarbeitung von Dateien mit Locale-Definitionen implementiert, die in UTF-8 anstelle von ASCII bereitgestellt werden.
- Funktionen zur Umwandlung von Multi-Byte-Codierungen mbrtoc8 und c8rtomb wurden hinzugefügt, die den Spezifikationen ISO C2X N2653 und C++20 P0482R6 entsprechen.
- Die Unterstützung für den Typ char8_t, der im Entwurf des Standards ISO C2X N2653 definiert ist, wurde hinzugefügt.
- Die Funktionen arc4random, arc4random_buf und arc4random_uniform wurden hinzugefügt, die Wrapper für den Systemaufruf getrandom und die Schnittstelle /dev/urandom bereitstellen und qualitativ hochwertige Pseudozufallszahlen zurückgeben.
- Auf der Linux-Plattform wurde die Unterstützung für die LoongArch-Befehlssatzarchitektur implementiert, die in den Loongson 3 5000-Prozessoren verwendet wird und ein neues RISC ISA implementiert, das MIPS und RISC-V ähnelt. Derzeit steht nur die Unterstützung der 64-Bit-Version von LoongArch (LA64) zur Verfügung. Es wird mindestens die Version 2.38 von binutils, GCC 12 und den Linux-Kernel 5.19 benötigt.
- Der prelink-Mechanismus sowie die damit verbundenen Umgebungsvariablen LD_TRACE_PRELINKING und LD_USE_LOAD_BIAS und die Möglichkeiten des Linkers wurden als veraltet erklärt und werden in der nächsten Version entfernt.
- Der Code zur Überprüfung der Linux-Kernel-Version und zur Verarbeitung der Umgebungsvariablen LD_ASSUME_KERNEL wurde entfernt. Die minimal unterstützte Kernel-Version beim Erstellen von Glibc wird über das ELF-Feld NT_GNU_ABI_TAG definiert.
- Auf der Linux-Plattform wurde die Unterstützung für die Umgebungsvariable LD_LIBRARY_VERSION eingestellt.
Quelle: opennet.ru
