Izdaja standardne knjižnice C Cosmopolitan 2.0, razvite za prenosne izvršljive datoteke

Objavljena je bila izdaja projekta Cosmopolitan 2.0, ki razvija standardno knjižnico C in univerzalni format izvedljive datoteke, ki se lahko uporablja za distribucijo programov za različne operacijske sisteme brez uporabe tolmačev in virtualnih strojev. Rezultat, dobljen s prevajanjem v GCC in Clang, se prevede v statično povezano univerzalno izvedljivo datoteko, ki jo je mogoče zagnati v kateri koli distribuciji Linuxa, macOS, Windows, FreeBSD, OpenBSD, NetBSD in jo lahko celo pokličete iz BIOS-a. Koda projekta se distribuira pod licenco ISC (poenostavljena različica MIT/BSD).

Vsebnik za generiranje univerzalnih izvršljivih datotek temelji na združevanju segmentov in glav, značilnih za različne operacijske sisteme (PE, ELF, MACHO, OPENBSD) v eni datoteki, ki združuje več različnih formatov, ki se uporabljajo v Unixu, Windows in macOS. Da bi zagotovili, da se ena izvršljiva datoteka izvaja v sistemih Windows in Unix, je trik v tem, da kodirate datoteke Windows PE kot lupinske skripte, pri čemer izkoristite dejstvo, da Thompson Shell ne uporablja oznake skripta "#!". Za ustvarjanje programov, ki vključujejo več datotek (povezovanje vseh virov v eno datoteko), podpira oblikovanje izvršljive datoteke v obliki posebej oblikovanega arhiva ZIP. Shema predlagane oblike (primer aplikacije hello.com):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(ukaz -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" izhod iz 1 REALNEGA NAČINA… ELF SEGMENTI… OPENBSD OPOMBA… MACHO GLAVE… KODA IN PODATKI… ZIP DIREKTOR…

Na začetku datoteke je označena oznaka "MZqFpD", ki je zaznana kot glava formata Windows PE. To zaporedje je dekodirano tudi v navodilu “pop %r10; jno 0x4a; jo 0x4a«, in vrstico »\177ELF« na navodilo »jg 0x47«, ki se uporabljata za posredovanje do vstopne točke. Sistemi Unix poganjajo lupinsko kodo, ki uporablja ukaz exec in posreduje izvršljivo kodo skozi neimenovano cev. Omejitev predlagane metode je zmožnost delovanja v operacijskih sistemih, podobnih Unixu, samo z uporabo lupin, ki podpirajo način združljivosti Thompson Shell.

Klic qemu-x86_64 zagotavlja dodatno prenosljivost in omogoča, da se koda, prevedena za arhitekturo x86_64, izvaja na platformah, ki niso x86, kot so plošče Raspberry Pi in naprave Apple, opremljene s procesorji ARM. Projekt je mogoče uporabiti tudi za ustvarjanje samostojnih aplikacij, ki delujejo brez operacijskega sistema (bare metal). V takšnih aplikacijah je zagonski nalagalnik priložen izvedljivi datoteki in program deluje kot zagonski operacijski sistem.

Standardna knjižnica C libc, razvita v okviru projekta, ponuja 2024 funkcij (v prvi izdaji je bilo približno 1400 funkcij). Kar zadeva zmogljivost, Cosmopolitan deluje enako hitro kot glibc in je opazno pred Musl in Newlib, kljub dejstvu, da je Cosmopolitan po velikosti kode za red velikosti manjši od glibc in približno ustreza Musl in Newlib. Za optimizacijo pogosto klicanih funkcij, kot sta memcpy in strlen, se dodatno uporablja tehnika »trickle-down performance«, pri kateri se za klic funkcije uporablja makro vezava, pri kateri je prevajalnik obveščen o registrih CPE, vključenih v izvajanje kode. proces, ki omogoča varčevanje z viri pri shranjevanju stanja CPE s shranjevanjem samo spremenljivih registrov.

Med spremembami v novi izdaji:

  • Shema za dostop do notranjih virov znotraj datoteke zip je bila spremenjena (pri odpiranju datotek se zdaj uporabljajo običajne poti /zip/... namesto uporabe predpone zip:..). Podobno je za dostop do diskov v sistemu Windows mogoče uporabiti poti, kot je »/c/...« namesto »C:/...«.
  • Predlagan je bil nov nalagalnik APE (Actually Portable Executable), ki definira format univerzalnih izvršljivih datotek. Novi nalagalnik uporablja mmap za postavitev programa v pomnilnik in vsebine ne spreminja več sproti. Po potrebi lahko univerzalno izvršljivo datoteko pretvorite v običajne izvršljive datoteke, vezane na posamezne platforme.
  • Na platformi Linux je mogoče uporabiti modul jedra binfmt_misc za izvajanje programov APE. Opozoriti je treba, da je uporaba binfmt_misc najhitrejši način zagona.
  • Za Linux je bila predlagana izvedba funkcionalnosti sistemskih klicev pledge() in unveil(), ki jih je razvil projekt OpenBSD. Na voljo je API za uporabo teh klicev v programih v C, C++, Python in Redbean, kot tudi pripomoček pledge.com za izolacijo poljubnih procesov.
  • Zgradba uporablja pripomoček Landlock Make – izdajo GNU Make s strožjim preverjanjem odvisnosti in uporabo sistemskega klica Landlock za izolacijo programa od preostalega sistema in izboljšanje učinkovitosti predpomnjenja. Kot možnost je ohranjena možnost gradnje z običajnim GNU Make.
  • Implementirane so bile funkcije za večnitnost - _spawn() in _join(), ki sta univerzalni povezavi prek API-jev, specifičnih za različne operacijske sisteme. Prav tako poteka delo za implementacijo podpore za niti POSIX.
  • Možno je uporabiti ključno besedo _Thread_local za uporabo ločenega pomnilnika za vsako nit (TLS, Thread-Local Storage). Izvajalno okolje C privzeto inicializira TLS za glavno nit, zaradi česar se je najmanjša velikost izvršljive datoteke povečala z 12 KB na 16 KB.
  • Podpora za parametra »--ftrace« in »--strace« je bila dodana izvedljivim datotekam za izpis informacij o vseh klicih funkcij in sistemskih klicih v stderr.
  • Dodana podpora za sistemski klic closefrom(), podprt v sistemih Linux 5.9+, FreeBSD 8+ in OpenBSD.
  • Na platformi Linux se je zmogljivost klicev clock_gettime in gettimeofday povečala do 10-krat z uporabo mehanizma vDSO (virtual dynamic shared object), ki omogoča premik upravljalnika sistemskega klica v uporabniški prostor in izogibanje preklopom konteksta.
  • Matematične funkcije za delo s kompleksnimi števili so bile premaknjene iz knjižnice Musl. Delo številnih matematičnih funkcij je bilo pospešeno.
  • Funkcija nointernet() je bila predlagana za onemogočanje omrežnih zmogljivosti.
  • Dodane nove funkcije za učinkovito dodajanje nizov: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf in vappendf.
  • Dodana je zaščitena različica družine funkcij kprintf(), zasnovana za delo s povišanimi privilegiji.
  • Bistveno izboljšana zmogljivost implementacij SSL, SHA, curve25519 in RSA.

Vir: opennet.ru

Dodaj komentar