Utgivelse av standard C-biblioteket Cosmopolitan 2.0, utviklet for bærbare kjørbare filer

Utgivelsen av Cosmopolitan 2.0-prosjektet har blitt publisert, og utvikler standard C-biblioteket og et universelt kjørbart filformat som kan brukes til å distribuere programmer for forskjellige operativsystemer uten bruk av tolker og virtuelle maskiner. Resultatet oppnådd ved å kompilere i GCC og Clang er kompilert til en statisk koblet universell kjørbar fil som kan kjøres på hvilken som helst Linux-distribusjon, macOS, Windows, FreeBSD, OpenBSD, NetBSD, og ​​til og med kalles fra BIOS. Prosjektkoden distribueres under ISC-lisensen (en forenklet versjon av MIT/BSD).

Beholderen for å generere universelle kjørbare filer er basert på å kombinere segmenter og overskrifter som er spesifikke for forskjellige operativsystemer (PE, ELF, MACHO, OPENBSD) i én fil, og kombinerer flere forskjellige formater brukt i Unix, Windows og macOS. For å sikre at en enkelt kjørbar fil kjører på Windows- og Unix-systemer, er et triks å kode Windows PE-filer som shell-skript, og dra nytte av det faktum at Thompson Shell ikke bruker "#!"-skriptmarkøren. For å lage programmer som inkluderer flere filer (lenker alle ressurser til én fil), støtter den dannelsen av en kjørbar fil i form av et spesialdesignet ZIP-arkiv. Opplegg for det foreslåtte formatet (eksempel hello.com-applikasjon):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(kommando -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… KODE OG DATA… ZIP DIRECTORY…

I begynnelsen av filen er etiketten "MZqFpD" angitt, som oppfattes som en overskrift i Windows PE-format. Denne sekvensen er også dekodet i instruksjonen “pop %r10; jno 0x4a ; jo 0x4a", og linjen "\177ELF" til instruksjonen "jg 0x47", som brukes til å videresende til inngangspunktet. Unix-systemer kjører skallkode som bruker exec-kommandoen, og sender den kjørbare koden gjennom et navngitt rør. En begrensning ved den foreslåtte metoden er muligheten til å kjøre på Unix-lignende operativsystemer kun ved bruk av skall som støtter Thompson Shell-kompatibilitetsmodus.

qemu-x86_64-anropet gir ekstra portabilitet og lar kode kompilert for x86_64-arkitekturen kjøres på ikke-x86-plattformer, for eksempel Raspberry Pi-kort og Apple-enheter utstyrt med ARM-prosessorer. Prosjektet kan også brukes til å lage selvstendige applikasjoner som kjører uten operativsystem (bare metal). I slike applikasjoner er en bootloader knyttet til den kjørbare filen, og programmet fungerer som et oppstartbart operativsystem.

Standard C-biblioteket libc utviklet av prosjektet tilbyr 2024 funksjoner (i den første utgivelsen var det omtrent 1400 funksjoner). Ytelsesmessig jobber Cosmopolitan like raskt som glibc og ligger merkbart foran Musl og Newlib, til tross for at Cosmopolitan er en størrelsesorden mindre i kodestørrelse enn glibc og tilsvarer omtrent Musl og Newlib. For å optimalisere ofte kalte funksjoner som memcpy og strlen, brukes i tillegg "trickle-down performance"-teknikken, der en makrobinding brukes til å kalle funksjonen, der kompilatoren informeres om CPU-registrene som er involvert i kodeutførelsen prosess, som tillater lagring av ressurser når du lagrer CPU-tilstand ved å lagre kun utskiftbare registre.

Blant endringene i den nye utgivelsen:

  • Opplegget for tilgang til interne ressurser inne i en zip-fil har blitt endret (ved åpning av filer, brukes nå de vanlige /zip/...-banene i stedet for å bruke zip:..-prefikset). På samme måte, for å få tilgang til disker i Windows, er det mulig å bruke stier som "/c/..." i stedet for "C:/...".
  • En ny APE-laster (Actually Portable Executable) har blitt foreslått, som definerer formatet til universelle kjørbare filer. Den nye lasteren bruker mmap til å plassere programmet i minnet og endrer ikke lenger innholdet i farten. Om nødvendig kan den universelle kjørbare filen konverteres til vanlige kjørbare filer knyttet til individuelle plattformer.
  • På Linux-plattformen er det mulig å bruke kjernemodulen binfmt_misc for å kjøre APE-programmer. Det bemerkes at bruk av binfmt_misc er den raskeste lanseringsmetoden.
  • For Linux er det foreslått en implementering av funksjonaliteten til pledge() og unveil() systemkallene utviklet av OpenBSD-prosjektet. En API er gitt for å bruke disse kallene i programmer i C, C++, Python og Redbean, samt et pledge.com-verktøy for å isolere vilkårlige prosesser.
  • Bygget bruker Landlock Make-verktøyet - en utgave av GNU Make med strengere avhengighetskontroll og bruk av Landlock-systemkallet for å isolere programmet fra resten av systemet og forbedre cachingseffektiviteten. Som et alternativ beholdes muligheten til å bygge med vanlig GNU Make.
  • Funksjoner for multithreading er implementert - _spawn() og _join(), som er universelle bindinger over APIer som er spesifikke for forskjellige operativsystemer. Det arbeides også med å implementere POSIX Threads-støtte.
  • Det er mulig å bruke nøkkelordet _Thread_local for å bruke separat lagring for hver tråd (TLS, Thread-Local Storage). Som standard initialiserer C-runtime TLS for hovedtråden, noe som har ført til at minimum kjørbare størrelse har økt fra 12 KB til 16 KB.
  • Støtte for parameterne "--ftrace" og "--strace" er lagt til kjørbare filer for å sende ut informasjon om alle funksjonskall og systemkall til stderr.
  • Lagt til støtte for closefrom() systemkallet, støttet på Linux 5.9+, FreeBSD 8+ og OpenBSD.
  • På Linux-plattformen har ytelsen til clock_gettime og gettimeofday-anrop blitt økt opptil 10 ganger ved å bruke vDSO-mekanismen (virtual dynamic shared object), som gjør det mulig å flytte systemanropsbehandleren til brukerområdet og unngå kontekstsvitsjer.
  • Matematiske funksjoner for arbeid med komplekse tall er flyttet fra Musl-biblioteket. Arbeidet med mange matematiske funksjoner har blitt fremskyndet.
  • Funksjonen nointernet() er foreslått for å deaktivere nettverksfunksjoner.
  • Lagt til nye funksjoner for effektivt å legge til strenger: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf og vappendf.
  • Lagt til en beskyttet versjon av kprintf()-familien av funksjoner, designet for å fungere med forhøyede privilegier.
  • Betydelig forbedret ytelse av SSL-, SHA-, curve25519- og RSA-implementeringer.

Kilde: opennet.ru

Legg til en kommentar