Vakio C-kirjaston Cosmopolitan 2.0 julkaisu, joka on kehitetty kannettaville suoritettaville tiedostoille

Cosmopolitan 2.0 -projektin julkaisu on julkaistu, ja se kehittää standardinmukaista C-kirjastoa ja universaalia suoritettavaa tiedostomuotoa, jolla voidaan jakaa ohjelmia eri käyttöjärjestelmiin ilman tulkkeja ja virtuaalikoneita. GCC:ssä ja Clangissa kääntämisellä saatu tulos käännetään staattisesti linkitetyksi yleiseksi suoritettavaksi tiedostoksi, jota voidaan käyttää missä tahansa Linux-jakelussa, macOS:ssä, Windowsissa, FreeBSD:ssä, OpenBSD:ssä, NetBSD:ssä ja jota voidaan jopa kutsua BIOSista. Projektikoodia jaetaan ISC-lisenssillä (yksinkertaistettu versio MIT/BSD:stä).

Universaalien suoritustiedostojen luomiseen tarkoitettu säilö perustuu eri käyttöjärjestelmille (PE, ELF, MACHO, OPENBSD) liittyvien segmenttien ja otsikoiden yhdistämiseen yhdeksi tiedostoksi, joka yhdistää useita eri Unixissa, Windowsissa ja macOS:ssä käytettyjä formaatteja. Jotta voidaan varmistaa, että yksi suoritettava tiedosto toimii Windows- ja Unix-järjestelmissä, temppu on koodata Windows PE -tiedostot komentosarjoiksi hyödyntäen sitä tosiasiaa, että Thompson Shell ei käytä "#!"-skriptimerkkiä. Useita tiedostoja sisältävien ohjelmien luominen (kaikki resurssit linkittämällä yhteen tiedostoon) tukee suoritettavan tiedoston muodostamista erityisesti suunnitellun ZIP-arkiston muodossa. Ehdotetun muodon kaava (esimerkki hello.com-sovellus):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(komento -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" poistu 1 TOSITILASTA… ELF-SEGMENTIT… AVAA OHJAUS… MACHO-OTSIKKOJA… KOODI JA TIEDOT… ZIP-HAKEMISTO…

Tiedoston alussa on otsikko "MZqFpD", joka nähdään Windows PE-muodon otsikkona. Tämä sekvenssi dekoodataan myös käskyssä "pop %r10; jno 0x4a ; jo 0x4a" ja rivi "\177ELF" käskyyn "jg 0x47", joita käytetään edelleen lähettämiseen tulopisteeseen. Unix-järjestelmät käyttävät shell-koodia, joka käyttää exec-komentoa ja välittää suoritettavan koodin nimettömän putken kautta. Ehdotetun menetelmän rajoituksena on kyky käyttää Unix-tyyppisissä käyttöjärjestelmissä vain Thompson Shell -yhteensopivuustilaa tukevia kuoria.

Qemu-x86_64-kutsu tarjoaa lisää siirrettävyyttä ja mahdollistaa x86_64-arkkitehtuuriin käännetyn koodin ajamisen muilla kuin x86-alustoilla, kuten Raspberry Pi -levyillä ja ARM-prosessoreilla varustetuilla Apple-laitteilla. Projektin avulla voidaan myös luoda itsenäisiä sovelluksia, jotka toimivat ilman käyttöjärjestelmää (paljas metalli). Tällaisissa sovelluksissa käynnistyslatain on liitetty suoritettavaan tiedostoon, ja ohjelma toimii käynnistettävänä käyttöjärjestelmänä.

Projektin kehittämä standardi C-kirjasto libc tarjoaa 2024 funktiota (ensimmäisessä versiossa funktioita oli noin 1400). Suorituskyvyn suhteen Cosmopolitan toimii yhtä nopeasti kuin glibc ja on huomattavasti edellä Muslia ja Newlibiä huolimatta siitä, että Cosmopolitan on koodikoon suuruusluokkaa pienempi kuin glibc ja vastaa suunnilleen Muslia ja Newlibiä. Usein kutsuttujen funktioiden, kuten memcpy ja strlen, optimoimiseksi käytetään lisäksi "trickle-down performance" -tekniikkaa, jossa funktion kutsumiseen käytetään makrosidontaa, jossa kääntäjälle ilmoitetaan koodin suorittamiseen osallistuvista CPU-rekistereistä. prosessi, joka mahdollistaa resurssien säästämisen CPU-tilaa tallennettaessa tallentamalla vain muutettavissa olevat rekisterit.

Uuden julkaisun muutoksista:

  • Zip-tiedoston sisäisten resurssien käyttötapaa on muutettu (tiedostoja avattaessa käytetään nyt tavallisia /zip/...-polkuja zip:..-etuliiteen sijaan). Samoin levyjen käyttämiseksi Windowsissa on mahdollista käyttää polkuja kuten "/c/..." "C:/..." sijaan.
  • On ehdotettu uutta APE (Actually Portable Executable) -latainta, joka määrittää yleisten suoritettavien tiedostojen muodon. Uusi latausohjelma tallentaa ohjelman muistiin mmap:n avulla eikä enää muuta sisältöä lennossa. Universaali suoritettava tiedosto voidaan tarvittaessa muuntaa tavallisiksi suoritettaviksi tiedostoiksi, jotka on sidottu yksittäisiin alustoihin.
  • Linux-alustalla on mahdollista käyttää binfmt_misc-ydinmoduulia APE-ohjelmien suorittamiseen. On huomattava, että binfmt_misc on nopein käynnistystapa.
  • Linuxille on ehdotettu OpenBSD-projektin kehittämien järjestelmäkutsujen pledge()- ja unveil()-toimintojen toteutusta. Saatavilla on API näiden kutsujen käyttämiseen C-, C++-, Python- ja Redbean-ohjelmissa sekä pledge.com-apuohjelma mielivaltaisten prosessien eristämiseen.
  • Rakennus käyttää Landlock Make -apuohjelmaa - GNU Make -versiota, jossa on tiukempi riippuvuustarkistus ja Landlock-järjestelmäkutsu ohjelman eristämiseksi muusta järjestelmästä ja välimuistin tehokkuuden parantamiseksi. Vaihtoehtona säilyy mahdollisuus rakentaa tavallisella GNU Makella.
  • Monisäikeistyksen toiminnot on otettu käyttöön - _spawn() ja _join(), jotka ovat yleisiä sidoksia eri käyttöjärjestelmille ominaisten API:iden yli. Myös POSIX Threads -tuen käyttöönotto on käynnissä.
  • _Thread_local-avainsanalla on mahdollista käyttää erillistä tallennustilaa jokaiselle säikeelle (TLS, Thread-Local Storage). Oletusarvoisesti C-ajonaika alustaa pääsäikeen TLS:n, minkä vuoksi suoritettavan tiedoston vähimmäiskoko on kasvanut 12:sta 16 kilotavuun.
  • Tuki "--ftrace"- ja "--strace"-parametreille on lisätty suoritettaviin tiedostoihin, jotta saadaan tietoa kaikista funktiokutsuista ja järjestelmäkutsuista stderrille.
  • Lisätty tuki closefrom()-järjestelmäkutsulle, jota tuetaan Linux 5.9+:ssa, FreeBSD 8+:ssa ja OpenBSD:ssä.
  • Linux-alustalla clock_gettime- ja gettimeofday-puheluiden suorituskykyä on kasvatettu jopa 10-kertaiseksi käyttämällä vDSO-mekanismia (virtual dynaamiset jaetut objektit), mikä mahdollistaa järjestelmän kutsunkäsittelijän siirtämisen käyttäjätilaan ja kontekstin vaihtamisen välttämiseksi.
  • Matemaattiset funktiot kompleksilukujen kanssa työskentelyyn on siirretty Musl-kirjastosta. Monien matemaattisten funktioiden työtä on nopeutettu.
  • nointernet()-funktiota on ehdotettu poistamaan verkkoominaisuudet.
  • Lisätty uusia toimintoja merkkijonojen tehokkaaseen liittämiseen: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf ja vappendf.
  • Lisätty suojattu versio kprintf()-funktioperheestä, joka on suunniteltu toimimaan korotetuilla oikeuksilla.
  • SSL-, SHA-, curve25519- ja RSA-toteutusten suorituskykyä parannettu merkittävästi.

Lähde: opennet.ru

Lisää kommentti