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

De uitgave van het Cosmopolitan-project 2.0 is gepubliceerd, dat de standaard C-bibliotheek en een universeel uitvoerformaat ontwikkelt dat gebruikt kan worden voor het verspreiden van programma's voor verschillende besturingssystemen zonder interpreters en virtuele machines. Het resultaat, verkregen via compilatie in GCC en Clang, wordt samengesteld in een statisch koppelbare universele uitvoerbaar bestand dat geschikt is voor uitvoering op elke Linux-distributie, macOS, Windows, FreeBSD, OpenBSD, NetBSD en zelfs kan worden aangeroepen vanuit de BIOS. De code van het project wordt verspreid onder de ISC-licentie (vereenvoudigde versie van MIT/BSD).

De container voor het vormen van universele uitvoerbare bestanden is gebaseerd op de combinatie van segmenten en headers die specifiek zijn voor verschillende besturingssystemen (PE, ELF, MACHO, OPENBSD) in één bestand, waarbij het meerdere verschillende formaten combineert die worden gebruikt in Unix, Windows en macOS. Om de uitvoering van één uitvoerbaar bestand op Windows en Unix-systemen mogelijk te maken, wordt een truc toegepast die verband houdt met de codering van Windows PE-bestanden als een shell-script, gebruikmakend van het feit dat de Thompson Shell geen scriptmarker "#!" gebruikt. Voor het maken van programma's die meerdere bestanden omvatten (samenvoegingen van alle middelen in één bestand) wordt de vorming van het uitvoerbare bestand in de vorm van een speciaal geformatteerde ZIP-archief ondersteund. Het schema van het voorgestelde formaat (voorbeeld van de applicatie hello.com):

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 REAL MODE… ELF SEGMENTS… OPENBSD NOTE… MACHO HEADERS… CODE AND DATA… ZIP DIRECTORY…

In het begin van het bestand wordt het label "MZqFpD" opgegeven, dat wordt gezien als de header van het Windows PE-formaat. Deze reeks wordt ook gedecodeerd in de instructie "pop %r10 ; jno 0x4a ; jo 0x4a", en de string "\177ELF" in de instructie "jg 0x47", die worden gebruikt voor het doorgeven naar het toegangspunt. In Unix-systemen wordt shell-code uitgevoerd, waarin het exec-commando wordt gebruikt met de uitvoerbare code via een onbenoembare pijp. Een beperking van de voorgestelde methode is dat uitvoering in Unix-achtige OS alleen mogelijk is met behulp van shells die de compatibiliteitsmodus met Thompson Shell ondersteunen.

De oproep qemu-x86_64 is bedoeld voor de implementatie van extra draagbaarheid en maakt het mogelijk om gecodeerde x86_64-code uit te voeren op platforms die geen x86 zijn, zoals Raspberry Pi-borden en Apple-apparaten met ARM-processors. Het project kan ook worden gebruikt voor het maken van autonome applicaties die draaien zonder besturingssysteem (bare metal). In dergelijke applicaties wordt een bootloader aan het uitvoerbare bestand gehecht, en de toepassing fungeert als het opstartbare besturingssysteem.

In de standaard C-bibliotheek libc die door het project wordt ontwikkeld, zijn 2024 functies voorgesteld (in de eerste uitgave waren er ongeveer 1400 functies). Qua prestaties werkt Cosmopolitan net zo snel als glibc en overtreft het Musl en Newlib aanzienlijk, terwijl Cosmopolitan qua codegrootte een orde van grootte kleiner is dan glibc en ongeveer overeenkomt met Musl en Newlib. Voor de optimalisatie van vaak aangeroepen functies zoals memcpy en strlen wordt bovendien de techniek 'trickle-down performance' gebruikt, waarbij voor het aanroepen van een functie een macro-wrapper wordt toegepast die de compiler informeert over de CPU-registers die bij het uitvoeren van de code betrokken zijn, waardoor middelen worden bespaard door alleen de wijzigbare registers op te slaan.

Onder de veranderingen in de nieuwe release:

  • De manier van aanspreken van interne bronnen binnen een zip-bestand is gewijzigd (bij het openen van bestanden worden nu gewone paden /zip/... gebruikt in plaats van verwijzingen zoals zip:..). Evenzo is voor toegang tot schijven in Windows de mogelijkheid toegevoegd om paden zoals '/c/...' te gebruiken in plaats van 'C:/...'.
  • Een nieuwe bootloader APE (Actually Portable Executable) is voorgesteld, die het formaat van universele uitvoerbare bestanden bepaalt. De nieuwe bootloader gebruikt mmap voor het plaatsen van het programma in het geheugen en wijzigt de inhoud niet meer ter plaatse. Indien nodig kan het universele uitvoerbare bestand worden omgezet in normale uitvoerbare bestanden, die aan afzonderlijke platforms zijn gebonden.
  • Op het Linux-platform is de mogelijkheid geïmplementeerd om de kernelmodule binfmt_misc te gebruiken voor het uitvoeren van APE-programma's. Het gebruik van binfmt_misc wordt opgemerkt als de snelste methode om programma's te starten.
  • Voor Linux is een implementatie van de systeemoproepen pledge() en unveil() aangeboden, ontwikkeld door het OpenBSD-project. Er is een API beschikbaar voor het gebruik van deze oproepen in programma's in C, C++, Python en Redbean, evenals de tool pledge.com voor het isoleren van willekeurige processen.
  • Voor de bouw wordt de tool Landlock Make gebruikt — een editie van GNU Make met strengere afhankelijkheidscontroles en het gebruik van de systeemoproep Landlock om het programma van de rest van het systeem te isoleren en de caching-efficiëntie te verhogen. Als optie blijft de mogelijkheid om te bouwen met de gewone GNU Make beschikbaar.
  • Functies voor multithreading zijn geïmplementeerd — _spawn() en _join(), die zich vertonen als universele wrappers rond specifieke API's van verschillende besturingssystemen. Er wordt ook gewerkt aan de implementatie van ondersteuning voor POSIX Threads.
  • De mogelijkheid om het sleutelwoord _Thread_local te gebruiken is aangeboden voor het gebruik van aparte opslagplaatsen voor elke thread (TLS, Thread-Local Storage). Standaard initialiseert de C-runtime TLS voor de hoofdthread, wat leidde tot een verhoging van de minimale bestandsgrootte van de uitvoerbare bestanden van 12 naar 16 KB.
  • De uitvoerbare bestanden hebben ondersteuning toegevoegd voor de parameters "—ftrace" en "—strace" voor het afdrukken naar stderr van informatie over alle functie- en systeemoproepen.
  • Ondersteuning voor de systeemoproep closefrom() is toegevoegd, ondersteund in Linux 5.9+, FreeBSD 8+ en OpenBSD.
  • Op het Linux-platform is de prestaties van de oproepen clock_gettime en gettimeofday tot 10 keer verhoogd door gebruik te maken van het vDSO-mechanisme (virtual dynamic shared object), waardoor het mogelijk is om de systeemoproep-handler naar de gebruikersruimte te verplaatsen en contextwisselingen te vermijden.
  • Wiskundige functies voor het werken met complexe getallen zijn uit de bibliotheek Musl overgezet. De prestaties van vele wiskundige functies zijn versneld.
  • De functie nointernet() is aangeboden, die netwerkmogelijkheden uitschakelt.
  • Nieuwe functies zijn toegevoegd voor efficiënte stringbevestiging: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf en vappendf.
  • Een beveiligde variant van de kprintf() functie is toegevoegd, bedoeld voor gebruik met verhoogde privileges.
  • De prestaties van implementaties zijn aanzienlijk verbeterd SSL, SHA, curve25519 en RSA.

Bron: opennet.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster