Kutulutsidwa kwa laibulale ya Cosmopolitan 2.0 yokhazikika C yopangidwa kuti izitha kunyamula

Kutulutsidwa kwa pulojekiti ya Cosmopolitan 2.0 kwasindikizidwa, kupanga laibulale yanthawi zonse ya C ndi mawonekedwe amtundu wapadziko lonse omwe angagwiritsidwe ntchito kugawa mapulogalamu a machitidwe osiyanasiyana opangira popanda kugwiritsa ntchito omasulira ndi makina enieni. Zotsatira zomwe zapezedwa polemba mu GCC ndi Clang zimaphatikizidwa kukhala fayilo yolumikizidwa yolumikizidwa yomwe imatha kuyendetsedwa pagawidwe lililonse la Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD, komanso kuyitanidwa kuchokera ku BIOS. Khodi ya polojekitiyi imagawidwa pansi pa layisensi ya ISC (mtundu wosavuta wa MIT/BSD).

Chidebe chopangira mafayilo otetezedwa padziko lonse lapansi chimachokera pakuphatikiza magawo ndi mitu yodziwika ndi machitidwe osiyanasiyana (PE, ELF, MACHO, OPENBSD) mufayilo imodzi, kuphatikiza mitundu ingapo yogwiritsidwa ntchito mu Unix, Windows ndi macOS. Kuwonetsetsa kuti fayilo imodzi yomwe ingathe kuchitidwa ikugwira ntchito pa Windows ndi Unix machitidwe, chinyengo ndikuyika mafayilo a Windows PE ngati zolemba zachipolopolo, kutenga mwayi chifukwa Thompson Shell sagwiritsa ntchito chizindikiro cha "#!". Kupanga mapulogalamu omwe ali ndi mafayilo angapo (kulumikiza zinthu zonse kukhala fayilo imodzi), imathandizira kupanga fayilo yomwe ingathe kuchitidwa ngati fayilo yosungidwa mwapadera ya ZIP. Chiwembu cha mtundu womwe waperekedwa (chitsanzo hello.com application):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" tulukani 1 REAL MODE… ELF SEGMENTS… OPENBSD NOTE… MACHO HEADERS… KODI NDI DATA… ZIP DIRECTORY…

Kumayambiriro kwa fayilo, chizindikiro "MZqFpD" chikuwonetsedwa, chomwe chimadziwika ngati mutu wamtundu wa Windows PE. Kutsatizanaku kumasinthidwanso mu malangizo "pop% r10; nsi 0x4a; jo 0x4a", ndi mzere "\177ELF" ku malangizo "jg 0x47", omwe amagwiritsidwa ntchito kupititsa patsogolo polowera. Machitidwe a Unix amayendetsa nambala ya chipolopolo yomwe imagwiritsa ntchito lamulo la exec, ndikudutsa kachidindo kameneka kudzera pa chitoliro chosatchulidwa dzina. Kuchepetsa njira yomwe akufunsidwa ndikutha kuyendetsa makina ogwiritsira ntchito a Unix pogwiritsa ntchito zipolopolo zomwe zimathandizira mawonekedwe a Thompson Shell.

Kuitana kwa qemu-x86_64 kumapereka mwayi wowonjezera ndikulola ma code opangidwa kuti x86_64 amangidwe kuti azigwira ntchito pamapulatifomu omwe si a x86, monga ma board a Raspberry Pi ndi zida za Apple zokhala ndi mapurosesa a ARM. Pulojekitiyi ingagwiritsidwenso ntchito popanga mapulogalamu odzipangira okha omwe amayenda popanda makina ogwiritsira ntchito (zitsulo zopanda kanthu). M'mapulogalamu otere, bootloader imamangiriridwa ku fayilo yomwe ingathe kuchitika, ndipo pulogalamuyo imakhala ngati makina opangira bootable.

Laibulale yanthawi zonse ya C libc yopangidwa ndi pulojekitiyi imapereka ntchito za 2024 (pakutulutsa koyamba kunali pafupifupi ntchito 1400). Pankhani ya kachitidwe, Cosmopolitan imagwira ntchito mwachangu ngati glibc ndipo ili patsogolo kwambiri pa Musl ndi Newlib, ngakhale kuti Cosmopolitan ndi dongosolo laling'ono la ma code kuposa glibc ndipo limafanana ndi Musl ndi Newlib. Kukhathamiritsa ntchito zomwe zimatchedwa pafupipafupi monga memcpy ndi strlen, njira ya "trickle-down performance" imagwiritsidwanso ntchito, momwe kumangirira kwakukulu kumagwiritsidwa ntchito kuyitanira ntchitoyi, pomwe wopanga amadziwitsidwa za ma regista a CPU omwe akukhudzidwa ndi ma code. ndondomeko, yomwe imalola kupulumutsa chuma posunga dziko la CPU posunga zolembera zosinthika zokha.

Zosintha pakutulutsa kwatsopano zikuphatikiza:

  • Ndondomeko yopezera zinthu zamkati mkati mwa fayilo ya zip yasinthidwa (pamene mukutsegula mafayilo, njira zachizolowezi / zip / ... tsopano zimagwiritsidwa ntchito m'malo mogwiritsa ntchito zip:.. prefix). Momwemonso, kuti mupeze ma disks mu Windows, ndizotheka kugwiritsa ntchito njira ngati "/c/....." m'malo mwa "C: / ...".
  • Chojambulira chatsopano cha APE (Actually Portable Executable) chaperekedwa, chomwe chimatanthawuza mawonekedwe a mafayilo omwe angathe kuchitidwa konsekonse. Chojambulira chatsopanocho chimagwiritsa ntchito mmap kuyika pulogalamuyo m'maganizo ndipo sichisinthanso zomwe zili mkati. Ngati ndi kotheka, fayilo yapadziko lonse lapansi imatha kusinthidwa kukhala mafayilo okhazikika omwe amamangiriridwa pamapulatifomu.
  • Pa nsanja ya Linux, ndizotheka kugwiritsa ntchito binfmt_misc kernel module kuyendetsa mapulogalamu a APE. Zimadziwika kuti kugwiritsa ntchito binfmt_misc ndiye njira yofulumira kwambiri.
  • Kwa Linux, kukhazikitsidwa kwa magwiridwe antchito a pledge() ndi unveil() mafoni opangidwa ndi pulojekiti ya OpenBSD kwaperekedwa. API imaperekedwa kuti mugwiritse ntchito mafoni awa m'mapulogalamu a C, C++, Python ndi Redbean, komanso chida cha pledge.com chodzipatula njira zosagwirizana.
  • Kumangaku kumagwiritsa ntchito Landlock Make utility - kope la GNU Make ndikuyang'anitsitsa kudalira kwambiri komanso kugwiritsa ntchito foni ya Landlock system kuti alekanitse pulogalamuyo kudongosolo lonselo ndikuwongolera magwiridwe antchito. Monga njira, kuthekera komanga ndi GNU Make wokhazikika kumasungidwa.
  • Ntchito zowerengera zambiri zakhazikitsidwa - _spawn() ndi _join(), zomwe ndi zomangira zapadziko lonse lapansi pa ma API okhudzana ndi machitidwe osiyanasiyana. Ntchito ikuchitikanso kukhazikitsa thandizo la POSIX Threads.
  • Ndizotheka kugwiritsa ntchito _Thread_local keyword kugwiritsa ntchito kusungirako kosiyana pa ulusi uliwonse (TLS, Thread-Local Storage). Mwachikhazikitso, nthawi yothamanga ya C imayambitsa TLS pa ulusi waukulu, zomwe zachititsa kuti kukula kwake kuchuluke kuchoka pa 12 KB kufika ku 16 KB.
  • Thandizo la "-ftrace" ndi "--strace" magawo awonjezedwa kumafayilo omwe angathe kuchitika kuti atulutse zidziwitso za mafoni onse ogwira ntchito ndi mafoni amtundu kupita ku stderr.
  • Thandizo lowonjezera la foni ya closefrom(), yothandizidwa pa Linux 5.9+, FreeBSD 8+ ndi OpenBSD.
  • Pa nsanja ya Linux, machitidwe a clock_gettime ndi gettimeofday mafoni awonjezedwa mpaka ka 10 pogwiritsa ntchito njira ya vDSO (virtual dynamic Shared object), zomwe zimapangitsa kuti zitheke kusuntha choyimba foni kumalo ogwiritsira ntchito ndikupewa kusintha kwa nkhani.
  • Ntchito zamasamu zogwirira ntchito ndi manambala ovuta zachotsedwa ku library ya Musl. Ntchito ya masamu ambiri yapita patsogolo.
  • Ntchito ya nointernet() yaperekedwa kuti iletse kuthekera kwa netiweki.
  • Onjezani ntchito zatsopano pazowonjezera bwino zingwe: append, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf ndi vappendf.
  • Onjezani mtundu wotetezedwa wa kprintf() banja la magwiridwe antchito, opangidwa kuti azigwira ntchito ndi mwayi wapamwamba.
  • Kuchita bwino kwambiri kwa SSL, SHA, curve25519 ndi RSA kukhazikitsa.

Source: opennet.ru

Kuwonjezera ndemanga