Udgivelse af standard C-biblioteket Cosmopolitan 2.0, udviklet til bærbare eksekverbare filer

Udgivelsen af ​​Cosmopolitan 2.0-projektet er blevet offentliggjort, der udvikler standard C-biblioteket og et universelt eksekverbart filformat, der kan bruges til at distribuere programmer til forskellige operativsystemer uden brug af tolke og virtuelle maskiner. Resultatet opnået ved kompilering i GCC og Clang er kompileret til en statisk forbundet universel eksekverbar fil, der kan køres på enhver Linux-distribution, macOS, Windows, FreeBSD, OpenBSD, NetBSD og endda kaldes fra BIOS. Projektkoden distribueres under ISC-licensen (en forenklet version af MIT/BSD).

Beholderen til generering af universelle eksekverbare filer er baseret på at kombinere segmenter og overskrifter, der er specifikke for forskellige operativsystemer (PE, ELF, MACHO, OPENBSD) i én fil, ved at kombinere flere forskellige formater, der bruges i Unix, Windows og macOS. For at sikre, at en enkelt eksekverbar fil kører på Windows- og Unix-systemer, er et trick at kode Windows PE-filer som shell-scripts, idet man udnytter det faktum, at Thompson Shell ikke bruger "#!"-scriptmarkøren. For at oprette programmer, der inkluderer flere filer (linker alle ressourcer til én fil), understøtter det dannelsen af ​​en eksekverbar fil i form af et specielt designet ZIP-arkiv. Skema for det foreslåede format (eksempel hello.com-applikation):

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 begyndelsen af ​​filen er etiketten "MZqFpD" angivet, som opfattes som en Windows PE-formatoverskrift. Denne sekvens er også afkodet i instruktionen "pop %r10; jno 0x4a ; jo 0x4a", og linjen "\177ELF" til instruktionen "jg 0x47", som bruges til at videresende til indgangspunktet. Unix-systemer kører shell-kode, der bruger exec-kommandoen, og sender den eksekverbare kode gennem et unavngivet rør. En begrænsning ved den foreslåede metode er muligheden for kun at køre på Unix-lignende operativsystemer ved brug af skaller, der understøtter Thompson Shell-kompatibilitetstilstand.

qemu-x86_64-opkaldet giver yderligere portabilitet og tillader kode kompileret til x86_64-arkitekturen at køre på ikke-x86-platforme, såsom Raspberry Pi-kort og Apple-enheder udstyret med ARM-processorer. Projektet kan også bruges til at skabe selvstændige applikationer, der kører uden et operativsystem (bare metal). I sådanne applikationer er en bootloader knyttet til den eksekverbare fil, og programmet fungerer som et bootbart operativsystem.

Standard C-biblioteket libc udviklet af projektet tilbyder 2024 funktioner (i den første udgivelse var der omkring 1400 funktioner). Ydeevnemæssigt virker Cosmopolitan lige så hurtigt som glibc og er mærkbart foran Musl og Newlib, på trods af at Cosmopolitan er en størrelsesorden mindre i kodestørrelse end glibc og omtrent svarer til Musl og Newlib. For at optimere ofte kaldede funktioner såsom memcpy og strlen, anvendes desuden "trickle-down performance"-teknikken, hvor en makrobinding bruges til at kalde funktionen, hvor compileren informeres om de CPU-registre, der er involveret i kodeudførelsen proces, som tillader lagring af ressourcer, når CPU-tilstand gemmes ved kun at gemme registre, der kan ændres.

Blandt ændringerne i den nye udgivelse:

  • Skemaet for adgang til interne ressourcer inde i en zip-fil er blevet ændret (ved åbning af filer, bruges de sædvanlige /zip/...-stier nu i stedet for at bruge zip:..-præfikset). Tilsvarende, for at få adgang til diske i Windows, er det muligt at bruge stier som "/c/..." i stedet for "C:/...".
  • En ny APE (Actually Portable Executable) loader er blevet foreslået, som definerer formatet for universelle eksekverbare filer. Den nye loader bruger mmap til at placere programmet i hukommelsen og ændrer ikke længere indholdet i farten. Om nødvendigt kan den universelle eksekverbare fil konverteres til almindelige eksekverbare filer knyttet til individuelle platforme.
  • På Linux-platformen er det muligt at bruge binfmt_misc-kernemodulet til at køre APE-programmer. Det bemærkes, at brug af binfmt_misc er den hurtigste lanceringsmetode.
  • For Linux er en implementering af funktionaliteten af ​​pledge() og unveil() systemkaldene udviklet af OpenBSD-projektet blevet foreslået. En API er tilvejebragt til at bruge disse kald i programmer i C, C++, Python og Redbean, samt et pledge.com-værktøj til at isolere vilkårlige processer.
  • Bygningen bruger Landlock Make-værktøjet - en udgave af GNU Make med strengere afhængighedskontrol og brugen af ​​Landlock-systemkaldet til at isolere programmet fra resten af ​​systemet og forbedre cache-effektiviteten. Som en mulighed bevares muligheden for at bygge med almindelig GNU Make.
  • Funktioner til multithreading er blevet implementeret - _spawn() og _join(), som er universelle bindinger over API'er, der er specifikke for forskellige operativsystemer. Der arbejdes også på at implementere POSIX Threads support.
  • Det er muligt at bruge nøgleordet _Thread_local til at bruge separat lagring for hver tråd (TLS, Thread-Local Storage). Som standard initialiserer C runtime TLS for hovedtråden, hvilket har fået den minimale eksekverbare størrelse til at øges fra 12 KB til 16 KB.
  • Understøttelse af parametrene "--ftrace" og "--strace" er blevet tilføjet til eksekverbare filer for at udlæse information om alle funktionskald og systemkald til stderr.
  • Tilføjet understøttelse af closefrom() systemkaldet, understøttet på Linux 5.9+, FreeBSD 8+ og OpenBSD.
  • På Linux-platformen er ydeevnen af ​​clock_gettime og gettimeofday-opkald blevet øget op til 10 gange ved at bruge vDSO-mekanismen (virtual dynamic shared object), som gør det muligt at flytte systemopkaldsbehandleren til brugerrummet og undgå kontekstskift.
  • Matematiske funktioner til at arbejde med komplekse tal er blevet flyttet fra Musl-biblioteket. Arbejdet med mange matematiske funktioner er blevet fremskyndet.
  • Funktionen nointernet() er blevet foreslået for at deaktivere netværksfunktioner.
  • Tilføjet nye funktioner til effektivt at tilføje strenge: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf og vappendf.
  • Tilføjet en beskyttet version af kprintf()-familien af ​​funktioner, designet til at arbejde med forhøjede privilegier.
  • Markant forbedret ydeevne af SSL, SHA, curve25519 og RSA implementeringer.

Kilde: opennet.ru

Tilføj en kommentar