Standardse C-teegi Cosmopolitan 2.0 väljalase, mis on välja töötatud kaasaskantavate täitmisfailide jaoks

Avaldatud on Cosmopolitan 2.0 projekti väljalase, mis arendab standardset C-teeki ja universaalset käivitatavat failivormingut, mille abil saab levitada programme erinevatele operatsioonisüsteemidele ilma tõlkeid ja virtuaalmasinaid kasutamata. GCC-s ja Clangis kompileerimisel saadud tulemus kompileeritakse staatiliselt lingitud universaalseks täitmisfailiks, mida saab käivitada mis tahes Linuxi distributsioonis, macOS-is, Windowsis, FreeBSD-s, OpenBSD-s, NetBSD-s ja mida saab isegi BIOS-ist välja kutsuda. Projekti koodi levitatakse ISC litsentsi (MIT/BSD lihtsustatud versioon) all.

Universaalsete täitmisfailide genereerimise konteiner põhineb erinevatele operatsioonisüsteemidele (PE, ELF, MACHO, OPENBSD) omaste segmentide ja päiste kombineerimisel ühes failis, kombineerides mitu erinevat Unixis, Windowsis ja macOS-is kasutatavat vormingut. Tagamaks, et Windowsi ja Unixi süsteemides töötab üks käivitatav fail, on nipp kodeerida Windows PE-failid kestaskriptidena, kasutades ära asjaolu, et Thompson Shell ei kasuta skriptimarkerit "#!". Mitut faili sisaldavate programmide loomiseks (kõik ressursid ühte faili sidudes) toetab see käivitatava faili moodustamist spetsiaalselt loodud ZIP-arhiivi kujul. Pakutud vormingu skeem (rakenduse hello.com näide):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(käsk -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" väljuge 1. REALREŽIIMIst… ELF SEGMENTS… AVABSD MÄRKUS… MACHO PÄISED… KOOD JA ANDMED… ZIP KATALOOG…

Faili alguses on märgitud silt “MZqFpD”, mida tajutakse Windows PE-vormingus päisena. See jada on dekodeeritud ka käsus “pop %r10; jno 0x4a; jo 0x4a" ja rida "\177ELF" käsule "jg 0x47", mida kasutatakse sisestuspunkti edastamiseks. Unixi süsteemid käitavad shellkoodi, mis kasutab exec-käsku, edastades käivitatava koodi nimetu toru kaudu. Pakutud meetodi piirang on võimalus töötada Unixi-laadsetes operatsioonisüsteemides ainult kestade abil, mis toetavad Thompson Shelli ühilduvusrežiimi.

Kutse qemu-x86_64 pakub täiendavat teisaldatavust ja võimaldab x86_64 arhitektuuri jaoks kompileeritud koodil töötada mitte-x86 platvormidel, nagu Raspberry Pi plaadid ja ARM-protsessoritega varustatud Apple'i seadmed. Projekti saab kasutada ka iseseisvate rakenduste loomiseks, mis töötavad ilma operatsioonisüsteemita (paljas metall). Sellistes rakendustes on käivitatavale failile lisatud alglaadur ja programm toimib käivitatava operatsioonisüsteemina.

Projekti poolt välja töötatud standardne C raamatukogu libc pakub 2024 funktsiooni (esimeses versioonis oli umbes 1400 funktsiooni). Toimivuse osas töötab Cosmopolitan sama kiiresti kui glibc ja edestab märgatavalt Musli ja Newlibi, hoolimata asjaolust, et Cosmopolitan on koodi suuruselt suurusjärgu võrra väiksem kui glibc ja vastab ligikaudu Muslile ja Newlibile. Sageli kutsutavate funktsioonide (nt memcpy ja strlen) optimeerimiseks kasutatakse lisaks “trikle-down performance” tehnikat, mille puhul kasutatakse funktsiooni kutsumiseks makrosidumist, mille käigus kompilaatorit teavitatakse koodi täitmisega seotud CPU registritest. protsess, mis võimaldab CPU oleku salvestamisel ressursse säästa, salvestades ainult muudetavad registrid.

Uue versiooni muudatuste hulgas:

  • Zip-faili sisemiste ressursside juurdepääsu skeemi on muudetud (failide avamisel kasutatakse nüüd tavalisi /zip/... teid, mitte zip:.. eesliidet). Samamoodi on Windowsis ketastele juurdepääsuks võimalik kasutada „C:/...” asemel selliseid teid nagu „/c/...”.
  • Välja on pakutud uus APE (Actually Portable Executable) laadur, mis määrab universaalsete täitmisfailide vormingu. Uus laadur kasutab programmi mällu paigutamiseks mmap-i ega muuda enam sisu käigu pealt. Vajadusel saab universaalse käivitatava faili teisendada tavalisteks täitmisfailideks, mis on seotud üksikute platvormidega.
  • Linuxi platvormil on APE programmide käivitamiseks võimalik kasutada kerneli moodulit binfmt_misc. Tuleb märkida, et binfmt_misc kasutamine on kiireim käivitamismeetod.
  • Linuxi jaoks on pakutud OpenBSD projektis välja töötatud süsteemikutsete pledge() ja unveil() funktsionaalsust. Nende kõnede kasutamiseks programmides C, C++, Python ja Redbean on saadaval API, samuti pledge.com-i utiliit suvaliste protsesside eraldamiseks.
  • Järel kasutab utiliiti Landlock Make – GNU Make'i väljaannet, mis sisaldab rangemat sõltuvuskontrolli ja Landlocki süsteemikutset, et isoleerida programm ülejäänud süsteemist ja parandada vahemällu salvestamise tõhusust. Võimalusena säilib tavalise GNU Makega ehitamise võimalus.
  • Rakendatud on mitme lõimega töötlemise funktsioonid – _spawn() ja _join(), mis on universaalsed sidumised erinevatele operatsioonisüsteemidele spetsiifiliste API-de üle. Töö käib ka POSIX Threadsi toe juurutamiseks.
  • Märksõna _Thread_local on võimalik kasutada iga lõime jaoks eraldi salvestusruumi kasutamiseks (TLS, Thread-Local Storage). Vaikimisi lähtestab C käitusaeg põhilõime jaoks TLS-i, mis on põhjustanud käivitatava faili minimaalse suuruse suurenemise 12 KB-lt 16 KB-le.
  • Parameetrite "--ftrace" ja "--strace" tugi on lisatud täitmisfailidele, et väljastada teavet kõigi funktsioonikutsete ja süsteemikutsete kohta stderrile.
  • Lisatud on closefrom() süsteemikõne tugi, mida toetatakse operatsioonisüsteemides Linux 5.9+, FreeBSD 8+ ja OpenBSD.
  • Linuxi platvormil on clock_gettime ja gettimeofday kõnede jõudlust suurendatud kuni 10 korda kasutades vDSO (virtual dynamic shared object) mehhanismi, mis võimaldab süsteemikõnede töötleja kasutajaruumi teisaldada ja kontekstivahetusi vältida.
  • Matemaatilised funktsioonid kompleksarvudega töötamiseks on teisaldatud Musli raamatukogust. Paljude matemaatiliste funktsioonide tööd on kiirendatud.
  • Funktsiooni nointernet() on pakutud võrguvõimaluste keelamiseks.
  • Stringide tõhusaks lisamiseks on lisatud uusi funktsioone: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf ja vappendf.
  • Lisatud funktsioonide perekonna kprintf() kaitstud versioon, mis on loodud töötama kõrgendatud õigustega.
  • Oluliselt paranenud SSL-i, SHA-, curve25519- ja RSA-rakenduste jõudlus.

Allikas: opennet.ru

Lisa kommentaar