Release fan de standert C-bibleteek Cosmopolitan 2.0, ûntwikkele foar draachbere útfierbere bestannen

De frijlitting fan it Cosmopolitan 2.0-projekt is publisearre, it ûntwikkeljen fan de standert C-bibleteek en in universele útfierber bestânsformaat dat kin wurde brûkt om programma's foar ferskate bestjoeringssystemen te fersprieden sûnder it brûken fan tolken en firtuele masines. It resultaat krigen troch kompilearjen yn GCC en Clang wurdt kompilearre yn in statysk keppele universele útfierbere triem dy't kin wurde útfierd op elke Linux-distribúsje, macOS, Windows, FreeBSD, OpenBSD, NetBSD, en sels neamd fanút de BIOS. De projektkoade wurdt ferspraat ûnder de ISC-lisinsje (in ferienfâldige ferzje fan MIT / BSD).

De kontener foar it generearjen fan universele útfierbere bestannen is basearre op it kombinearjen fan segminten en kopteksten spesifyk foar ferskate bestjoeringssystemen (PE, ELF, MACHO, OPENBSD) yn ien bestân, it kombinearjen fan ferskate ferskillende formaten brûkt yn Unix, Windows en macOS. Om te soargjen dat ien útfierber bestân rint op Windows- en Unix-systemen, is in trúk om Windows PE-bestannen te kodearjen as shell-skripts, en profitearje fan it feit dat Thompson Shell de "#!"-skriptmarker net brûkt. Om programma's te meitsjen dy't ferskate bestannen omfetsje (alle boarnen keppelje yn ien bestân), stipet it de formaasje fan in útfierber bestân yn 'e foarm fan in spesjaal ûntwurpen ZIP-argyf. Skema fan it foarstelde formaat (foarbyld hello.com-applikaasje):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(kommando -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 EN DATA… ZIP DIRECTORY…

Oan it begjin fan it bestân wurdt it label "MZqFpD" oanjûn, dat wurdt waarnommen as in koptekst fan Windows PE-formaat. Dizze folchoarder wurdt ek dekodearre yn 'e ynstruksje "pop %r10; jno 0x4a; jo 0x4a", en de line "\177ELF" nei de ynstruksje "jg 0x47", dy't wurde brûkt om troch te gean nei it yngongspunt. Unix-systemen rinne shell-koade dy't it exec-kommando brûkt, en de útfierbere koade trochjaan troch in net neamde piip. In beheining fan 'e foarstelde metoade is de mooglikheid om te rinnen op Unix-like bestjoeringssystemen allinich mei help fan shells dy't Thompson Shell-kompatibiliteitsmodus stypje.

De qemu-x86_64-oprop leveret ekstra portabiliteit en lit koade gearstald foar de x86_64-arsjitektuer rinne op net-x86-platfoarms, lykas Raspberry Pi-boards en Apple-apparaten útrist mei ARM-processors. It projekt kin ek brûkt wurde om selsstannige applikaasjes te meitsjen dy't rinne sûnder in bestjoeringssysteem (keale metaal). Yn sokke applikaasjes wurdt in bootloader oan it útfierbere bestân ferbûn, en it programma fungearret as in bootber bestjoeringssysteem.

De standert C-biblioteek libc ûntwikkele troch it projekt biedt 2024-funksjes (yn 'e earste release wiene d'r sawat 1400 funksjes). Yn termen fan prestaasjes, Cosmopolitan wurket sa fluch as glibc en is merkber foarút fan Musl en Newlib, nettsjinsteande it feit dat Cosmopolitan is in folchoarder fan grutte lytser yn koade grutte as glibc en likernôch oerienkomt mei Musl en Newlib. Om faak neamde funksjes lykas memcpy en strlen te optimalisearjen, wurdt ek de "trickle-down performance" technyk brûkt, wêrby't in makrobinding brûkt wurdt om de funksje op te roppen, wêryn de kompilator ynformearre wurdt oer de CPU-registers dy't belutsen binne by de útfiering fan koade. proses, wêrmei it bewarjen fan boarnen by it bewarjen fan CPU-tastân troch allinich feroarjende registers te bewarjen.

Under de feroaringen yn 'e nije release:

  • It skema foar tagong ta ynterne boarnen yn in zip-bestân is feroare (by it iepenjen fan bestannen wurde no de gewoane /zip/...-paden brûkt ynstee fan it foarheaksel zip:..). Lykas, om tagong te krijen ta skiven yn Windows, is it mooglik om paden te brûken lykas "/c/..." ynstee fan "C:/...".
  • In nije APE (Actually Portable Executable) loader is foarsteld, dy't it formaat definiearret fan universele útfierbere bestannen. De nije loader brûkt mmap om it programma yn it ûnthâld te pleatsen en feroaret de ynhâld net mear op 'e flecht. As it nedich is, kin it universele útfierbere bestân wurde omboud ta reguliere útfierbere bestannen bûn oan yndividuele platfoarms.
  • Op it Linux-platfoarm is it mooglik om de binfmt_misc-kernelmodule te brûken om APE-programma's út te fieren. It wurdt opmurken dat it brûken fan binfmt_misc de rapste startmetoade is.
  • Foar Linux is in ymplemintaasje fan 'e funksjonaliteit fan' e pledge () en unveil () systeemoproppen ûntwikkele troch it OpenBSD-projekt foarsteld. In API wurdt levere foar it brûken fan dizze oproppen yn programma's yn C, C++, Python en Redbean, lykas ek in pledge.com-hulpprogramma foar it isolearjen fan willekeurige prosessen.
  • De build brûkt it hulpprogramma Landlock Make - in edysje fan GNU Make mei strangere ôfhinklikheidskontrôle en it gebrûk fan 'e Landlock-systeemoprop om it programma te isolearjen fan 'e rest fan it systeem en de caching-effisjinsje te ferbetterjen. As opsje wurdt de mooglikheid om te bouwen mei reguliere GNU Make behâlden.
  • Funksjes foar multithreading binne ymplementearre - _spawn () en _join (), dy't universele bindingen binne oer API's spesifyk foar ferskate bestjoeringssystemen. Der wurdt ek wurke oan it ymplementearjen fan POSIX Threads-stipe.
  • It is mooglik om it kaaiwurd _Thread_local te brûken om aparte opslach te brûken foar elke thread (TLS, Thread-Local Storage). Standert initialisearret de C-runtime TLS foar de haadthread, wat feroarsake hat dat de minimale útfierbere grutte fan 12 KB nei 16 KB ferheget.
  • Stipe foar de parameters "--ftrace" en "--strace" is tafoege oan útfierbere bestannen om ynformaasje út te jaan oer alle funksje-oproppen en systeemoproppen nei stderr.
  • Stipe tafoege foar de closefrom() systeemoprop, stipe op Linux 5.9+, FreeBSD 8+ en OpenBSD.
  • Op it Linux-platfoarm is de prestaasjes fan clock_gettime en gettimeofday-oproppen oant 10 kear ferhege troch it vDSO-meganisme (firtual dynamic shared object) te brûken, wat it mooglik makket om de systeemoprophantler nei brûkersromte te ferpleatsen en kontekstwiksels te foarkommen.
  • Wiskundige funksjes foar wurkjen mei komplekse getallen binne ferpleatst fan 'e Musl-bibleteek. It wurk fan in protte wiskundige funksjes is fersneld.
  • De funksje nointernet() is foarsteld om netwurkmooglikheden út te skeakeljen.
  • Nije funksjes tafoege foar it effisjint taheakjen fan snaren: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf en vappendf.
  • Tafoege in beskerme ferzje fan de kprintf () famylje fan funksjes, ûntwurpen om te wurkjen mei ferhege privileezjes.
  • Signifikant ferbettere prestaasjes fan SSL, SHA, curve25519 en RSA ymplemintaasjes.

Boarne: opennet.ru

Add a comment