Uitgave van de standaard C-bibliotheek Cosmopolitan 2.0, ontwikkeld voor draagbare uitvoerbare bestanden

De release van het Cosmopolitan 2.0-project is gepubliceerd, waarin de standaard C-bibliotheek en een universeel uitvoerbaar bestandsformaat zijn ontwikkeld dat kan worden gebruikt om programma's voor verschillende besturingssystemen te distribueren zonder het gebruik van tolken en virtuele machines. Het resultaat dat wordt verkregen door het compileren in GCC en Clang wordt gecompileerd in een statisch gekoppeld universeel uitvoerbaar bestand dat kan worden uitgevoerd op elke Linux-distributie, macOS, Windows, FreeBSD, OpenBSD, NetBSD en zelfs kan worden aangeroepen vanuit het BIOS. De projectcode wordt gedistribueerd onder de ISC-licentie (een vereenvoudigde versie van MIT/BSD).

De container voor het genereren van universele uitvoerbare bestanden is gebaseerd op het combineren van segmenten en headers die specifiek zijn voor verschillende besturingssystemen (PE, ELF, MACHO, OPENBSD) in één bestand, waarbij verschillende formaten worden gecombineerd die worden gebruikt in Unix, Windows en macOS. Om ervoor te zorgen dat één enkel uitvoerbaar bestand op Windows- en Unix-systemen draait, is het een truc om Windows PE-bestanden te coderen als shell-scripts, waarbij gebruik wordt gemaakt van het feit dat Thompson Shell de scriptmarkering "#!" niet gebruikt. Om programma's te maken die meerdere bestanden bevatten (alle bronnen in één bestand koppelen), ondersteunt het de vorming van een uitvoerbaar bestand in de vorm van een speciaal ontworpen ZIP-archief. Schema van het voorgestelde formaat (voorbeeld hello.com-applicatie):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" exit 1 ECHTE MODUS… ELF SEGMENTEN… OPENBSD OPMERKING… MACHO HEADERS… CODE EN GEGEVENS… ZIP-LIJST…

Aan het begin van het bestand wordt het label “MZqFpD” aangegeven, dat wordt gezien als een header in Windows PE-formaat. Deze reeks wordt ook gedecodeerd in de instructie “pop %r10; jno 0x4a; jo 0x4a", en de regel "\177ELF" naar de instructie "jg 0x47", die worden gebruikt om door te sturen naar het toegangspunt. Unix-systemen voeren shell-code uit die gebruikmaakt van het exec-commando, waarbij de uitvoerbare code via een naamloze pipe wordt doorgegeven. Een beperking van de voorgestelde methode is de mogelijkheid om alleen op Unix-achtige besturingssystemen te draaien met behulp van shells die de Thompson Shell-compatibiliteitsmodus ondersteunen.

De qemu-x86_64-oproep biedt extra draagbaarheid en zorgt ervoor dat code die is gecompileerd voor de x86_64-architectuur kan worden uitgevoerd op niet-x86-platforms, zoals Raspberry Pi-borden en Apple-apparaten die zijn uitgerust met ARM-processors. Het project kan ook worden gebruikt om op zichzelf staande applicaties te maken die zonder besturingssysteem draaien (bare metal). In dergelijke toepassingen wordt een bootloader aan het uitvoerbare bestand gekoppeld en fungeert het programma als een opstartbaar besturingssysteem.

De standaard C-bibliotheek libc die door het project is ontwikkeld, biedt 2024 functies (in de eerste release waren er ongeveer 1400 functies). Qua prestaties werkt Cosmopolitan net zo snel als glibc en loopt hij merkbaar voor op Musl en Newlib, ondanks het feit dat Cosmopolitan qua codegrootte een orde van grootte kleiner is dan glibc en ongeveer overeenkomt met Musl en Newlib. Om veelgebruikte functies zoals memcpy en strlen te optimaliseren, wordt bovendien de "trickle-down performance" -techniek gebruikt, waarbij een macrobinding wordt gebruikt om de functie aan te roepen, waarbij de compiler wordt geïnformeerd over de CPU-registers die betrokken zijn bij de code-uitvoering proces, waarmee bronnen kunnen worden bespaard bij het opslaan van de CPU-status door alleen veranderlijke registers op te slaan.

Onder de veranderingen in de nieuwe release:

  • Het schema voor toegang tot interne bronnen in een zip-bestand is gewijzigd (bij het openen van bestanden worden nu de gebruikelijke /zip/...-paden gebruikt in plaats van het voorvoegsel zip:..). Op dezelfde manier is het voor toegang tot schijven in Windows mogelijk om paden als “/c/...” te gebruiken in plaats van “C:/...”.
  • Er is een nieuwe APE-lader (Actually Portable Executable) voorgesteld, die het formaat van universele uitvoerbare bestanden definieert. De nieuwe lader gebruikt mmap om het programma in het geheugen te plaatsen en verandert de inhoud niet langer direct. Indien nodig kan het universele uitvoerbare bestand worden geconverteerd naar reguliere uitvoerbare bestanden die aan individuele platforms zijn gekoppeld.
  • Op het Linux-platform is het mogelijk om de kernelmodule binfmt_misc te gebruiken om APE-programma's uit te voeren. Opgemerkt wordt dat het gebruik van binfmt_misc de snelste startmethode is.
  • Voor Linux is een implementatie voorgesteld van de functionaliteit van de belofte() en reveal() systeemaanroepen ontwikkeld door het OpenBSD-project. Er is een API beschikbaar voor het gebruik van deze aanroepen in programma's in C, C++, Python en Redbean, evenals een belofte.com-hulpprogramma voor het isoleren van willekeurige processen.
  • De build maakt gebruik van het hulpprogramma Landlock Make - een editie van GNU Make met strengere controle op afhankelijkheid en het gebruik van de Landlock-systeemaanroep om het programma van de rest van het systeem te isoleren en de caching-efficiëntie te verbeteren. Als optie blijft de mogelijkheid om met regulier GNU Make te bouwen behouden.
  • Er zijn functies voor multithreading geïmplementeerd: _spawn() en _join(), dit zijn universele bindingen via API's die specifiek zijn voor verschillende besturingssystemen. Er wordt ook gewerkt aan de implementatie van POSIX Threads-ondersteuning.
  • Het is mogelijk om het trefwoord _Thread_local te gebruiken om voor elke thread aparte opslag te gebruiken (TLS, Thread-Local Storage). Standaard initialiseert de C-runtime TLS voor de hoofdthread, waardoor de minimale uitvoerbare grootte is toegenomen van 12 KB naar 16 KB.
  • Ondersteuning voor de parameters “--ftrace” en “--strace” is toegevoegd aan uitvoerbare bestanden om informatie over alle functieaanroepen en systeemaanroepen naar stderr uit te voeren.
  • Ondersteuning toegevoegd voor de closefrom() systeemaanroep, ondersteund op Linux 5.9+, FreeBSD 8+ en OpenBSD.
  • Op het Linux-platform zijn de prestaties van clock_gettime- en gettimeofday-aanroepen tot tien keer verhoogd door gebruik te maken van het vDSO-mechanisme (virtual dynamic shared object), dat het mogelijk maakt om de systeemaanroephandler naar de gebruikersruimte te verplaatsen en contextwisselingen te vermijden.
  • Wiskundige functies voor het werken met complexe getallen zijn verplaatst uit de Musl-bibliotheek. Het werk van veel wiskundige functies is versneld.
  • De functie nointernet() is voorgesteld om netwerkmogelijkheden uit te schakelen.
  • Nieuwe functies toegevoegd voor het efficiënt toevoegen van tekenreeksen: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf en vappendf.
  • Er is een beveiligde versie van de kprintf()-familie van functies toegevoegd, ontworpen om met verhoogde rechten te werken.
  • Aanzienlijk verbeterde prestaties van SSL-, SHA-, curve25519- en RSA-implementaties.

Bron: opennet.ru

Voeg een reactie