Pagpagawas sa standard nga C library nga Cosmopolitan 2.0, nga gimugna alang sa madaladala nga mga executable nga mga file

Ang pagpagawas sa Cosmopolitan 2.0 nga proyekto gimantala, nga nagpalambo sa standard C library ug usa ka universal executable file format nga magamit sa pag-apod-apod sa mga programa alang sa lain-laing mga operating system nga walay paggamit sa mga tighubad ug mga virtual machine. Ang resulta nga nakuha pinaagi sa pag-compile sa GCC ug Clang gihugpong ngadto sa usa ka statically linked universal executable file nga mahimong ipadagan sa bisan unsang Linux distribution, macOS, Windows, FreeBSD, OpenBSD, NetBSD, ug bisan gitawag gikan sa BIOS. Ang code sa proyekto giapod-apod ubos sa lisensya sa ISC (usa ka gipasimple nga bersyon sa MIT/BSD).

Ang sudlanan alang sa paghimo sa unibersal nga mga executable nga mga file gibase sa paghiusa sa mga bahin ug mga ulohan nga piho sa lainlaing mga operating system (PE, ELF, MACHO, OPENBSD) sa usa ka file, nga naghiusa sa daghang lainlaing mga format nga gigamit sa Unix, Windows ug macOS. Aron masiguro nga ang usa ka executable file modagan sa Windows ug Unix system, usa ka lansis ang pag-encode sa mga file sa Windows PE isip mga shell script, nga nagpahimulos sa kamatuoran nga ang Thompson Shell wala mogamit sa "#!" script marker. Aron makahimo og mga programa nga naglakip sa daghang mga file (pagsumpay sa tanang mga kapanguhaan ngadto sa usa ka file), kini nagsuporta sa pagporma sa usa ka executable file sa porma sa usa ka espesyal nga gidisenyo ZIP archive. Scheme sa gisugyot nga format (pananglitan hello.com aplikasyon):

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

Sa sinugdanan sa file, ang label nga "MZqFpD" gipakita, nga giisip nga usa ka header sa format sa Windows PE. Kini nga han-ay gi-decode usab sa instruksyon nga "pop %r10; jno 0x4a ; jo 0x4a", ug ang linya nga "\177ELF" ngadto sa instruksiyon nga "jg 0x47", nga gigamit sa pagpasa ngadto sa entry point. Ang mga sistema sa Unix nagpadagan sa shell code nga naggamit sa exec command, nga nagpasa sa executable code pinaagi sa usa ka wala nganli nga tubo. Ang limitasyon sa gisugyot nga pamaagi mao ang abilidad sa pagdagan sa mga operating system nga sama sa Unix gamit lang ang mga shell nga nagsuporta sa Thompson Shell compatibility mode.

Ang qemu-x86_64 nga tawag naghatag og dugang nga portability ug nagtugot sa code nga giipon alang sa x86_64 nga arkitektura nga modagan sa non-x86 nga mga plataporma, sama sa Raspberry Pi boards ug Apple device nga adunay mga ARM processor. Ang proyekto mahimo usab nga gamiton sa paghimo sa kaugalingon nga mga aplikasyon nga nagdagan nga walay operating system (bare metal). Sa ingon nga mga aplikasyon, usa ka bootloader ang gilakip sa executable file, ug ang programa naglihok ingon usa ka bootable operating system.

Ang standard nga C library libc nga gihimo sa proyekto nagtanyag sa 2024 nga mga gimbuhaton (sa una nga pagpagawas adunay mga 1400 nga mga gimbuhaton). Sa termino sa pasundayag, ang Cosmopolitan naglihok sama ka paspas sa glibc ug namatikdan nga nag-una sa Musl ug Newlib, bisan pa sa kamatuoran nga ang Cosmopolitan usa ka han-ay sa magnitude nga mas gamay sa gidak-on sa code kay sa glibc ug halos katumbas sa Musl ug Newlib. Aron ma-optimize ang kanunay nga gitawag nga mga function sama sa memcpy ug strlen, ang "trickle-down performance" nga teknik dugang nga gigamit, diin ang usa ka macro binding gigamit aron tawagan ang function, diin ang compiler gipahibalo bahin sa mga rehistro sa CPU nga nahilambigit sa pagpatuman sa code. proseso, nga nagtugot sa pagtipig sa mga kapanguhaan kung nagtipig sa kahimtang sa CPU pinaagi sa pagtipig lamang sa mga nabag-o nga rehistro.

Lakip sa mga pagbag-o sa bag-ong pagpagawas:

  • Ang laraw alang sa pag-access sa internal nga mga kapanguhaan sa sulod sa usa ka zip file nausab (sa pag-abli sa mga file, ang naandan nga /zip/... nga mga agianan gigamit na karon imbis nga gamiton ang zip:.. prefix). Sa susama, aron ma-access ang mga disk sa Windows, posible nga gamiton ang mga agianan sama sa "/ c / ..." imbes nga "C: / ...".
  • Usa ka bag-ong APE (Actually Portable Executable) loader ang gisugyot, nga naghubit sa format sa universal executable files. Ang bag-ong loader naggamit sa mmap aron ibutang ang programa sa memorya ug dili na usbon ang mga sulod sa langaw. Kung gikinahanglan, ang universal executable file mahimong mabag-o ngadto sa regular nga executable nga mga file nga gihigot sa indibidwal nga mga plataporma.
  • Sa plataporma sa Linux, posible nga gamiton ang binfmt_misc kernel module para magpadagan sa mga programa sa APE. Namatikdan nga ang paggamit sa binfmt_misc mao ang labing paspas nga pamaagi sa paglansad.
  • Alang sa Linux, gisugyot ang pagpatuman sa pagpaandar sa pledge() ug unveil() system calls nga gihimo sa proyekto sa OpenBSD. Gihatag ang usa ka API alang sa paggamit niini nga mga tawag sa mga programa sa C, C ++, Python ug Redbean, ingon man usa ka utility sa pledge.com alang sa pagbulag sa mga arbitraryong proseso.
  • Ang pagtukod naggamit sa Landlock Make utility - usa ka edisyon sa GNU Make nga adunay mas estrikto nga dependency checking ug ang paggamit sa Landlock system nga tawag aron ihimulag ang programa gikan sa ubang bahin sa sistema ug mapausbaw ang caching efficiency. Ingon usa ka kapilian, ang abilidad sa pagtukod gamit ang regular nga GNU Make gipadayon.
  • Gipatuman ang mga function alang sa multithreading - _spawn() ug _join(), nga maoy universal bindings sa mga API nga espesipiko sa lain-laing operating system. Nagpadayon usab ang trabaho aron ipatuman ang suporta sa POSIX Threads.
  • Posible nga gamiton ang _Thread_local nga keyword aron magamit ang bulag nga pagtipig alang sa matag hilo (TLS, Thread-Local Storage). Sa kasagaran, ang C runtime nag-initialize sa TLS para sa main thread, nga maoy hinungdan nga ang minimum nga executable nga gidak-on mosaka gikan sa 12 KB ngadto sa 16 KB.
  • Ang suporta alang sa "--ftrace" ug "--strace" nga mga parametro gidugang ngadto sa mga executable nga mga file aron sa pag-output sa impormasyon mahitungod sa tanang function calls ug system calls ngadto sa stderr.
  • Gidugang nga suporta alang sa closefrom() system call, gisuportahan sa Linux 5.9+, FreeBSD 8+ ug OpenBSD.
  • Sa plataporma sa Linux, ang pasundayag sa clock_gettime ug gettimeofday nga mga tawag nadugangan hangtod sa 10 ka beses pinaagi sa paggamit sa vDSO (virtual dynamic shared object) nga mekanismo, nga nagpaposible sa pagbalhin sa tigdumala sa tawag sa sistema ngadto sa wanang sa tiggamit ug paglikay sa mga switch sa konteksto.
  • Ang mga gimbuhaton sa matematika alang sa pagtrabaho sa mga komplikadong numero gibalhin gikan sa Musl library. Ang trabaho sa daghang mga gimbuhaton sa matematika gipadali.
  • Ang nointernet() function gisugyot sa pag-disable sa mga kapabilidad sa network.
  • Gidugang ang bag-ong mga gimbuhaton alang sa episyente nga pagdugtong sa mga kuwerdas: apend, apendf, apendr, mga apend, apendw, apendz, kappendf, kvappendf ug vappendf.
  • Gidugang ang usa ka gipanalipdan nga bersyon sa kprintf () nga pamilya sa mga gimbuhaton, nga gidisenyo aron magtrabaho nga adunay taas nga mga pribilehiyo.
  • Mahinungdanon nga gipaayo nga performance sa SSL, SHA, curve25519 ug RSA nga mga pagpatuman.

Source: opennet.ru

Idugang sa usa ka comment