Serbestberdana pirtûkxaneya standard C Cosmopolitan 2.0, ku ji bo pelên birêkûpêk ên portable hatî pêşve xistin

Serbestberdana projeya Cosmopolitan 2.0 hate weşandin, pêşkeftina pirtûkxaneya standard C û formatek pelê ya gerdûnî ya ku dikare were bikar anîn ji bo belavkirina bernameyan ji bo pergalên xebitandinê yên cihêreng bêyî karanîna wergêr û makîneyên virtual. Encama ku bi berhevkirina di GCC û Clang de hatî wergirtin di pelek darvekirî ya gerdûnî ya bi statîkî ve girêdayî ye ku dikare li ser her belavkirina Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD, û tewra ji BIOS-ê jî tê gotin were xebitandin. Koda projeyê di bin lîsansa ISC de (guhertoyek MIT / BSD ya hêsankirî) tê belav kirin.

Konteynir ji bo hilberîna pelên darvekirî yên gerdûnî li ser bingeha yekkirina beş û sernavên taybetî yên pergalên xebitandinê yên cihêreng (PE, ELF, MACHO, OPENBSD) di yek pelê de ye, û çend formên cihêreng ên ku di Unix, Windows û macOS de têne bikar anîn berhev dike. Ji bo ku pê ewle bibe ku pelek yekane ya darvekirî li ser pergalên Windows û Unix-ê dimeşîne, hîleyek ev e ku hûn pelên Windows PE wekî nivîsarên şêlê kod bikin, ji vê yekê sûd werdigirin ku Thompson Shell nîşankera skrîptê "#!" bikar nayîne. Ji bo afirandina bernameyên ku çend pelan vedihewîne (hemû çavkaniyan bi yek pelê ve girêdide), ew di forma arşîvek ZIP-ya taybetî ya sêwirandî de avakirina pelek darvekirinê piştgirî dike. Plana forma pêşniyarê (mînakek serîlêdana hello.com):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(ferman -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" Derkeve 1 MODE REAL… BEŞÊN ELF… NÊŞA VEKIRINA BSD… SERÊN MACHO… KOD Û DATA… PÊRDÎNA Zip…

Di destpêka pelê de, nîşana "MZqFpD" tê destnîşan kirin, ku wekî sernavek formata Windows PE-ê tê dîtin. Ev rêzik jî di talîmata “pop %r10; jno 0x4a; jo 0x4a", û rêza "\177ELF" ji talîmata "jg 0x47" re, ku ji bo şandina ber bi xala têketinê ve têne bikar anîn. Pergalên Unix-ê koda şêlê dimeşînin ku fermana exec bikar tîne, koda îcrakar di nav boriyek bênav re derbas dike. Sînorek rêbaza pêşniyarkirî ev e ku meriv li ser pergalên xebitandinê yên mîna Unix-ê tenê bi karanîna şêlên ku moda lihevhatina Thompson Shell piştgirî dike bikar bîne.

Banga qemu-x86_64 veguheztina zêde peyda dike û destûrê dide koda ku ji bo mîmariya x86_64 hatî berhev kirin ku li ser platformên ne-x86, wek panelên Raspberry Pi û cîhazên Apple yên ku bi pêvajoyên ARM-ê ve girêdayî ne, bixebite. Di heman demê de proje dikare were bikar anîn da ku serîlêdanên xweser ên ku bêyî pergala xebitandinê (metalê tazî) dimeşînin, were afirandin. Di serîlêdanên weha de, bootloaderek bi pelê darvekirî ve girêdayî ye, û bername wekî pergala xebitandinê ya bootable tevdigere.

Pirtûkxaneya standard C libc ya ku ji hêla projeyê ve hatî pêşve xistin fonksiyonên 2024 pêşkêşî dike (di berdana yekem de nêzî 1400 fonksiyon hebûn). Di warê performansê de, Cosmopolitan bi lez û bez bi glibc dixebite û bi baldarî li pêş Musl û Newlib e, tevî vê yekê ku Cosmopolitan di mezinahiya kodê de ji glibc piçûktir e û bi qasî Musl û Newlib re têkildar e. Ji bo xweşbînkirina fonksiyonên wekî memcpy û strlen ku pir caran jê re têne gotin, teknîka "performansa trickle-down" wekî din tê bikar anîn, ku tê de girêdanek makro ji bo bangkirina fonksiyonê tê bikar anîn, ku tê de berhevkar li ser qeydên CPU yên ku di darvekirina kodê de têkildar in agahdar dibe. pêvajo, ku destûrê dide teserûfkirina çavkaniyan dema ku rewşa CPU-yê tomar dike bi hilanîna tenê tomarên guhêrbar.

Di nav guhertinên di serbestberdana nû de:

  • Pîlana gihîştina çavkaniyên hundurîn di hundurê pelek zip de hate guheztin (dema pelan vedikin, rêyên /zip/... yên adetî naha li şûna karanîna zip:.. pêşgir têne bikar anîn). Bi heman awayî, ji bo gihîştina dîskên Windows-ê, gengaz e ku meriv rêyên wekî "/c/..." li şûna "C:/..." bikar bîne.
  • Barkerek nû ya APE (Bi Rastî Veguhastbar Bikarhêner) hate pêşniyar kirin, ku formata pelên darvekirî yên gerdûnî diyar dike. Barkera nû mmap-ê bikar tîne da ku bernameyê di bîranînê de bi cîh bike û êdî naverokê di firînê de naguherîne. Ger hewce be, pelê darvekirî ya gerdûnî dikare bibe pelên birêkûpêk ên ku bi platformên kesane ve girêdayî ne veguhezîne.
  • Li ser platforma Linux-ê, gengaz e ku meriv modula kernelê binfmt_misc bikar bîne da ku bernameyên APE bimeşîne. Tê zanîn ku karanîna binfmt_misc rêbaza destpêkirina zûtirîn e.
  • Ji bo Linux, pêkanînek fonksiyona bangên pergala pledge() û unveil() ku ji hêla projeya OpenBSD ve hatî pêşve xistin, hate pêşniyar kirin. APIyek ji bo karanîna van bangan di bernameyên C, C++, Python û Redbean de, û her weha amûrek pledge.com ji bo veqetandina pêvajoyên kêfî tê peyda kirin.
  • Avakirin bikêrhatina Landlock Make bikar tîne - guhertoyek GNU Make bi kontrolkirina girêdayîbûna hişktir û karanîna banga pergala Landlock-ê ji bo veqetandina bernameyê ji pergalên mayî û baştirkirina kargêriya cachkirinê. Wekî vebijark, şiyana avakirina bi GNU Make bi rêkûpêk tê parastin.
  • Fonksiyonên ji bo multithreading hatine bicîh kirin - _spawn () û _join (), ku li ser API-yên taybetî yên pergalên xebitandinê yên cihêreng girêdanên gerdûnî ne. Di heman demê de ji bo pêkanîna piştgirîya POSIX Threads jî xebat didomin.
  • Mimkun e ku meriv peyva _Thread_local bikar bîne da ku ji bo her mijarê hilanînek cuda bikar bîne (TLS, Mijar-Storage Local). Ji hêla xwerû ve, dema xebitandinê C TLS-ê ji bo mijara sereke dest pê dike, ku ev yek bûye sedem ku mezinahiya herî kêm a îcrakar ji 12 KB berbi 16 KB zêde bibe.
  • Piştgiriya ji bo parametreyên "--ftrace" û "--strace" li pelên îcrakar hatiye zêdekirin da ku agahdariya li ser hemî bangên fonksiyonê û bangên pergalê ji stderr re derxîne.
  • Piştgiriya ji bo banga pergalê closefrom() zêde kir, ku li Linux 5.9+, FreeBSD 8+ û OpenBSD tê piştgirî kirin.
  • Li ser platforma Linux-ê, performansa bangên clock_gettime û gettimeofday bi karanîna mekanîzmaya vDSO (tişta hevpar a dînamîkî ya virtual) heya 10 qatan zêde bûye, ku ev gengaz dike ku meriv rêvekera bangê ya pergalê biguhezîne cîhê bikarhêner û xwe ji guheztinên kontekstê dûr bixe.
  • Fonksiyonên matematîkî yên ji bo xebitandina hejmarên tevlihev ji pirtûkxaneya Musl hatine derxistin. Karê gelek fonksiyonên matematîkî lez kirin.
  • Fonksiyona nointernet() ji bo neçalakkirina kapasîteyên torê hate pêşniyar kirin.
  • Fonksiyonên nû ji bo lêvekirina bi bandor a rêzan zêde kirin: pêvekirin, pêvekirin, pêvekirin, pêvekirin, pêvekirin, pêvekirin, pêvekirin, kappendf, kvappendf û vappendf.
  • Guhertoyek parastî ya malbata fonksiyonên kprintf() lê zêde kir, ku ji bo xebata bi îmtiyazên bilind hatî çêkirin.
  • Performansa girîng a pêkanînên SSL, SHA, curve25519 û RSA çêtir kirin.

Source: opennet.ru

Add a comment