Kosmopoliitne standardne C-teek 2.0 on välja antud, arendades seda ülekantavatele täidetavatele failidele.

Avalikuks on antud Cosmopolitan 2.0 versioon, mis arendab välja standardse C-teegi ja universaalse käivitatava faili formaadi, mida saab kasutada programmide levitamiseks erinevates operatsioonisüsteemides ilma tõlgendajate ja virtuaalmasinate kasutamiseta. GCC ja Clang'i abil kompileerimise tulemus koondatakse staatiliselt siduvaks universaalseks käivitatavaks failiks, mida saab käivitada mis tahes Linuxi, macOS, Windowsi, FreeBSD, OpenBSD, NetBSD ja isegi BIOS-ist. Projekti kood on litsentseeritud ISC (lihtsustatud variant MIT/BSD) alusel.

Üks universaalsete käivitatavate failide konteiner põhineb erinevate operatsiooni süsteemide spetsiifiliste segmentide ja pealkirjade (PE, ELF, MACHO, OPENBSD) ühendamisel ühes failis, kombineerides mitmeid erinevaid vorminguid, mida kasutatakse Unixis, Windowsis ja macOS-is. Ühe käivitatava faili käitamiseks Windowsis ja Unix-süsteemides kasutatakse trikki, mis seisneb Windows PE failide kodeerimises shell-skriptideks, kasutades sellega, et Thompson Shell ei kasuta skriptimärki «#!». Paljude failide (kõikide ressursside koondamine ühte faili) sisaldavate programmide loomiseks toetatakse käivitatava faili vormistamist spetsiaalselt vormindatud ZIP-arhiivina. Pakutava formaadi skeem (rakenduse näide 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…

Faili alguses on märgistus „MZqFpD“, mida tõlgendatakse Windows PE formaadi pealkirjana. See järjestus dekodeeritakse samuti käsuks „pop %r10 ; jno 0x4a ; jo 0x4a“, ja rida „\177ELF“ käsuks „jg 0x47“, mida kasutatakse sisenemispunkti suunamiseks. Unix-süsteemides käivitatakse shell-kood, mis kasutab exec käsku, edastades täitmise koodi anonüümse kanali kaudu. Pakutava meetodi piiranguks on, et Unix-laadsetes operatsioonisüsteemides saab seda käivitada ainult shell'ide kasutamisel, mis toetavad Thompson Shelli ühilduvust.

Käsk qemu-x86_64 on ette nähtud täiendava ülekantavuse tagamiseks ja võimaldab x86_64 arhitektuurile compileeritud koodi käivitada platvormidel, mis erinevad x86-st, näiteks Raspberry Pi plaatidel ja Apple'i seadmetes, mis on varustatud ARM protsessoritega. Projekti saab kasutada ka iseseisvate rakenduste loomiseks, mis töötavad ilma operatsioonisüsteemita (bare metal). Nendes rakendustes on teostava faili külge kinnitatud käivitusprogramm ja programm toimib laaditud operatsioonisüsteemina.

Projekti arendatud standardse C teegi libc raames on pakutud 2024 funktsiooni (esimeses väljaandes oli umbes 1400 funktsiooni). Kosmopoliit töötab jõudluselt sama kiiresti nagu glibc ning ületab märgatavalt Musl ja Newlib, olles samas koodimahtult kümme korda väiksem kui glibc ning vastates ligikaudu Musl ja Newlib'ile. Tihti kutsutavate funktsioonide, näiteks memcpy ja strlen, optimeerimiseks kasutatakse lisaks „trickle-down performance” tehnikat, kus funktsiooni väljakutsumiseks rakendatakse makroketti, milles kompilaatorit teavitatakse CPU registritest, mis on koodi täitmisel kaasatud, võimaldades ressursse säästa CPU seisundi hoidmisel, salvestades ainult muudetud registrid.

Uue väljaande muudatused:

  • Muudetud on skeemi, kuidas pöörduda zip-faili sisemiste ressursside poole (failide avamisel kasutatakse nüüd tavalisi radu /zip/… asemel, et pöörduda prefiksiga zip:..). Samamoodi on Windowsis tihendite juurdepääsu jaoks antud võimalus kasutada teid, nagu „/c/…”, mitte „C:/…”.
  • Uus APE (Actually Portable Executable) laadija määratleb universaalsete täidetavate failide formaadi. Uus laadija kasutab programmi mälu paigutamiseks mmap'i ja ei muuda sisu reaalajas. Vastavalt vajadusele saab universaalse täidetava faili konverteerida tavalisteks täidetavateks failideks, mis on seotud erinevate platvormidega.
  • Linuxi platvormil on kasutusele võetud binfmt_misc kernelimooduli võimalus APE-programmide käivitamiseks. Märgitakse, et binfmt_misc'i kasutamine on kiireim meetod käivitamiseks.
  • Linuxile on pakutud terviklikkuse süsteemi kutsungite pledge() ja unveil() teisendust, mille on arendanud OpenBSD projekt. Antakse API nende kutsete kasutamiseks C, C++, Python ja Redbean programmides, samuti utiliit pledge.com juhuslike protsesside isoleerimiseks.
  • Kokomise protsessis kasutatakse Landlock Make utiliiti — GNU Make eriversiooni, millel on rangem sõltuvuste kontroll ja süsteemi kutse Landlock kasutamine programmi isoleerimiseks ülejäänud süsteemist ning kiiruskaitse tõhususe suurendamiseks. Tavalise GNU Make'i kokkupanekuvõime on valikuna säilitatud.
  • Rakendatud on mitme lõime toetegevused — _spawn() ja _join(), mis pakuvad universaalseid töötlusi erinevate operatsioonisüsteemide API-de üle. Samuti töötatakse POSIX-lõimedega toe rakendamise kallal.
  • Pakutud on võimalus kasutada märksõna _Thread_local, et luua iga lõime jaoks eraldi salvestusi (TLS, Thread-Local Storage). Vaikimisi initsialiseerib C runtime TLS peamise lõime jaoks, mis on suurendanud käivitatava faili minimaalset suurust 12 KB-lt 16 KB-le.
  • Käivitatavatele failidele on lisatud toetus parameetritele «—ftrace» ja «—strace», et väljundisse stderr suunata teavet kõigi funktsioonikutsungite ja süsteemi kutsungite kohta.
  • Lisatud on toetus süsteemi kutsungile closefrom(), mis on toetatud Linux 5.9+, FreeBSD 8+ ja OpenBSD.
  • Linuxi platvormil on kellakutsungite ja gettimeofday funktsioonide jõudlust suurendatud kuni 10 korda vDSO (virtuaalne dünaamiline jagatud objekt) mehhanismi kasutamise tõttu, mis võimaldab süsteemi kutsungi töötlejat kasutajaruumi viia ja vältida konteksti vahetusi.
  • Musl teegib matemaatika funktsioone keeruliste arvudega töötamiseks. Paljusid matemaatilisi funktsioone on kiiruselt parendatud.
  • Pakutud on funktsioon nointernet(), mis keelab võrguühenduse.
  • Uued funktsioonid on lisatud tõhusaks stringide kinnitamiseks: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf ja vappendf.
  • Lisatud on turvaline variant kprintf() funktsioonide pere, mis on mõeldud kõrgendatud õiguste korral töötamiseks.
  • Rakenduste jõudlust on märgatavalt suurendatud SSL, SHA, curve25519 ja RSA.

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster