Tso tawm tus qauv C lub tsev qiv ntawv Cosmopolitan 2.0, tsim rau cov ntaub ntawv nqa tau yooj yim

Qhov kev tso tawm ntawm Cosmopolitan 2.0 qhov project tau tshaj tawm, txhim kho tus qauv C lub tsev qiv ntawv thiab cov ntaub ntawv executable universal uas tuaj yeem siv los faib cov kev pab cuam rau cov kev khiav hauj lwm sib txawv yam tsis tas siv cov neeg txhais lus thiab cov tshuab virtual. Cov txiaj ntsig tau los ntawm kev sau ua ke hauv GCC thiab Clang tau muab tso ua ke rau hauv cov ntaub ntawv txuas nrog universal executable file uas tuaj yeem khiav ntawm txhua qhov Linux faib, macOS, Windows, FreeBSD, OpenBSD, NetBSD, thiab txawm hu los ntawm BIOS. Txoj haujlwm code raug faib raws li daim ntawv tso cai ISC (ib qho yooj yim version ntawm MIT / BSD).

Lub thawv rau tsim cov ntaub ntawv universal executable yog raws li kev sib txuas ntu thiab cov ntsiab lus tshwj xeeb rau cov kev khiav hauj lwm sib txawv (PE, ELF, MACHO, OPENBSD) hauv ib cov ntaub ntawv, sib txuas ntau hom ntawv siv hauv Unix, Windows thiab macOS. Txhawm rau kom ntseeg tau tias ib qho kev ua tiav ib leeg khiav ntawm Windows thiab Unix systems, qhov ua kom yuam kev yog txhawm rau nkag mus rau Windows PE cov ntaub ntawv raws li cov ntawv plhaub, ua kom zoo dua qhov tseeb tias Thompson Plhaub tsis siv "#!" tsab ntawv cim. Txhawm rau tsim cov kev pab cuam uas suav nrog ntau cov ntaub ntawv (txuas tag nrho cov peev txheej rau hauv ib cov ntaub ntawv), nws txhawb kev tsim cov ntaub ntawv executable hauv daim ntawv ntawm ZIP archive tshwj xeeb. Cov txheej txheem ntawm daim ntawv thov (piv txwv li hello.com daim ntawv thov):

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

Thaum pib ntawm cov ntaub ntawv, daim ntawv lo "MZqFpD" yog qhia, uas pom tau tias yog Windows PE hom header. Cov kab ke no kuj tau txiav txim siab hauv cov lus qhia β€œpop %r10; j 0 x4a;. jo 0x4a", thiab kab "\177ELF" rau cov lus qhia "jg 0x47", uas yog siv los xa mus rau qhov chaw nkag. Unix systems khiav lub plhaub code uas siv cov lus txib exec, hla cov lej ua tiav los ntawm cov yeeb nkab tsis muaj npe. Ib qho kev txwv ntawm txoj kev npaj yog lub peev xwm khiav ntawm Unix-zoo li kev khiav hauj lwm systems tsuas yog siv cov plhaub uas txhawb Thompson Plhaub hom kev sib raug zoo.

Lub qemu-x86_64 hu muab kev thauj mus los ntxiv thiab tso cai tso cai tso ua ke rau x86_64 architecture khiav ntawm non-x86 platforms, xws li Raspberry Pi boards thiab Apple li nruab nrog ARM processors. Txoj haujlwm tseem tuaj yeem siv los tsim cov ntawv thov tus kheej uas khiav tsis muaj kev khiav haujlwm (liab liab qab). Hauv cov ntawv thov zoo li no, bootloader txuas nrog rau cov ntaub ntawv executable, thiab qhov kev zov me nyuam ua haujlwm ua haujlwm bootable.

Tus qauv C lub tsev qiv ntawv libc tsim los ntawm qhov project muaj 2024 lub zog (hauv thawj qhov kev tso tawm muaj txog 1400 lub luag haujlwm). Hais txog kev ua tau zoo, Cosmopolitan ua haujlwm sai li glibc thiab pom tau ua ntej ntawm Musl thiab Newlib, txawm tias qhov tseeb tias Cosmopolitan yog qhov kev txiav txim ntawm qhov loj me me hauv cov lej loj dua li glibc thiab kwv yees li sib haum mus rau Musl thiab Newlib. Txhawm rau optimize nquag hu ua haujlwm xws li memcpy thiab strlen, cov txheej txheem "trickle-down kev ua tau zoo" yog siv ntxiv, uas yog siv macro binding los hu rau lub luag haujlwm, nyob rau hauv uas lub compiler tau qhia txog CPU sau npe koom nrog hauv kev ua lej. txheej txheem, uas tso cai rau txuag cov peev txheej thaum txuag CPU lub xeev los ntawm kev txuag cov npe hloov pauv nkaus xwb.

Ntawm cov kev hloov pauv hauv qhov kev tso tawm tshiab:

  • Lub tswv yim rau kev nkag mus rau cov peev txheej sab hauv hauv cov ntaub ntawv zip tau raug hloov pauv (thaum qhib cov ntaub ntawv, cov kab /zip/... li niaj zaus tam sim no siv tsis yog siv zip: .. prefix). Ib yam li ntawd, txhawm rau nkag mus rau disks hauv Windows, nws tuaj yeem siv txoj hauv kev zoo li "/c/ ... " es tsis yog "C: / ... ".
  • APE tshiab (Qhov tseeb Portable Executable) loader tau raug npaj, uas txhais cov hom ntawv ntawm universal executable files. Tus tshiab loader siv mmap los tso qhov kev pab cuam hauv nco thiab tsis hloov cov ntsiab lus ntawm ya. Yog tias tsim nyog, universal executable cov ntaub ntawv tuaj yeem hloov mus rau hauv cov ntaub ntawv executable tsis tu ncua khi rau ib lub platforms.
  • Ntawm Linux platform, nws tuaj yeem siv binfmt_misc kernel module los khiav APE cov kev pab cuam. Nws tau sau tseg tias siv binfmt_misc yog txoj kev xa tawm sai tshaj plaws.
  • Rau Linux, kev ua haujlwm ntawm kev cog lus () thiab nthuav tawm () kev hu xov tooj tsim los ntawm OpenBSD qhov project tau raug npaj. Ib qho API yog muab rau kev siv cov kev hu no hauv cov kev pab cuam hauv C, C ++, Python thiab Redbean, nrog rau cov khoom siv cog lus.com rau kev cais cov txheej txheem arbitrary.
  • Kev tsim siv Landlock Make utility - ib tsab ntawm GNU Ua nrog kev soj ntsuam nruj dua thiab kev siv Landlock system hu kom cais cov kev pab cuam los ntawm qhov seem ntawm qhov system thiab txhim kho caching efficiency. Raws li kev xaiv, lub peev xwm los tsim nrog GNU Make yog khaws cia.
  • Kev ua haujlwm rau multithreading tau raug coj los siv - _spawn() thiab _join(), uas yog kev khi thoob ntiaj teb hla APIs tshwj xeeb rau cov kev khiav hauj lwm sib txawv. Kev ua haujlwm tseem tab tom pib siv POSIX Threads txhawb nqa.
  • Nws muaj peev xwm siv _Thread_local lo lus tseem ceeb siv cais cia rau txhua qhov xov (TLS, Xov-Local Storage). Los ntawm lub neej ntawd, C runtime pib TLS rau cov xov tseem ceeb, uas tau ua rau qhov tsawg kawg nkaus ua tiav qhov loj los ntawm 12 txog 16 KB.
  • Kev them nyiaj yug rau "--ftrace" thiab "--strace" tsis tau ntxiv rau cov ntaub ntawv executable los tso tawm cov ntaub ntawv hais txog txhua txoj haujlwm hu thiab hu xov tooj rau stderr.
  • Ntxiv kev txhawb nqa rau closefrom() system hu, txhawb rau Linux 5.9+, FreeBSD 8+ thiab OpenBSD.
  • Ntawm Linux platform, kev ua tau zoo ntawm clock_gettime thiab gettimeofday hu tau nce mus txog 10 zaug los ntawm kev siv vDSO (virtual dynamic share object) mechanism, uas ua rau nws muaj peev xwm txav tau lub kaw lus hu rau tus neeg siv rau qhov chaw siv thiab tsis txhob hloov cov ntsiab lus.
  • Kev ua lej rau kev ua haujlwm nrog cov lej nyuaj tau raug txav los ntawm Musl lub tsev qiv ntawv. Kev ua haujlwm ntawm ntau txoj haujlwm lej tau nrawm dua.
  • Lub nointernet() muaj nuj nqi tau thov kom lov tes taw network peev xwm.
  • Ntxiv cov haujlwm tshiab rau cov hlua txuas ntxiv kom zoo: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf thiab vappendf.
  • Ntxiv ib qho kev tiv thaiv version ntawm kprintf() tsev neeg ntawm kev ua haujlwm, tsim los ua haujlwm nrog cov cai siab.
  • Txhim kho kev ua tau zoo ntawm SSL, SHA, curve25519 thiab RSA kev siv.

Tau qhov twg los: opennet.ru

Ntxiv ib saib