Paglabas ng karaniwang C library na Cosmopolitan 2.0, na binuo para sa mga portable executable file

Ang pagpapalabas ng proyektong Cosmopolitan 2.0 ay nai-publish, na bumubuo ng karaniwang C library at isang unibersal na executable na format ng file na maaaring magamit upang ipamahagi ang mga programa para sa iba't ibang mga operating system nang hindi gumagamit ng mga interpreter at virtual machine. Ang resulta na nakuha sa pamamagitan ng pag-compile sa GCC at Clang ay pinagsama-sama sa isang statically linked na unibersal na executable file na maaaring patakbuhin sa anumang pamamahagi ng Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD, at kahit na tinatawag mula sa BIOS. Ang code ng proyekto ay ipinamahagi sa ilalim ng lisensya ng ISC (isang pinasimpleng bersyon ng MIT/BSD).

Ang lalagyan para sa pagbuo ng mga unibersal na executable na file ay batay sa pagsasama-sama ng mga segment at header na partikular sa iba't ibang operating system (PE, ELF, MACHO, OPENBSD) sa isang file, na pinagsasama ang ilang iba't ibang format na ginagamit sa Unix, Windows at macOS. Upang matiyak na ang isang solong executable file ay tumatakbo sa Windows at Unix system, ang isang trick ay ang pag-encode ng mga file ng Windows PE bilang mga script ng shell, sinasamantala ang katotohanang hindi ginagamit ng Thompson Shell ang "#!" script marker. Upang lumikha ng mga program na may kasamang ilang mga file (pagli-link ng lahat ng mga mapagkukunan sa isang file), sinusuportahan nito ang pagbuo ng isang maipapatupad na file sa anyo ng isang espesyal na idinisenyong ZIP archive. Scheme ng iminungkahing format (halimbawa 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" "$ @" lumabas sa 1 REAL MODE... ELF SEGMENTS... OPENBSD NOTE... MACHO HEADERS... CODE AND DATA... ZIP DIRECTORY...

Sa simula ng file, ang label na "MZqFpD" ay ipinahiwatig, na nakikita bilang isang header ng format ng Windows PE. Ang pagkakasunud-sunod na ito ay na-decode din sa pagtuturo na "pop %r10; jno 0x4a ; jo 0x4a", at ang linyang "\177ELF" sa pagtuturo na "jg 0x47", na ginagamit para ipasa sa entry point. Ang mga Unix system ay nagpapatakbo ng shell code na gumagamit ng exec command, na nagpapasa ng executable code sa pamamagitan ng isang hindi pinangalanang pipe. Ang isang limitasyon ng iminungkahing pamamaraan ay ang kakayahang tumakbo sa mga operating system na katulad ng Unix gamit lamang ang mga shell na sumusuporta sa Thompson Shell compatibility mode.

Ang qemu-x86_64 na tawag ay nagbibigay ng karagdagang portability at nagbibigay-daan sa code na pinagsama-sama para sa x86_64 na arkitektura na tumakbo sa mga non-x86 na platform, tulad ng mga Raspberry Pi board at mga Apple device na nilagyan ng mga ARM processor. Magagamit din ang proyekto upang lumikha ng mga self-contained na application na tumatakbo nang walang operating system (bare metal). Sa ganitong mga application, ang isang bootloader ay naka-attach sa executable file, at ang program ay gumaganap bilang isang bootable operating system.

Ang karaniwang C library libc na binuo ng proyekto ay nag-aalok ng 2024 na mga function (sa unang release ay may mga 1400 na mga function). Sa mga tuntunin ng pagganap, gumagana ang Cosmopolitan nang kasing bilis ng glibc at kapansin-pansing nauuna sa Musl at Newlib, sa kabila ng katotohanan na ang Cosmopolitan ay isang order ng magnitude na mas maliit sa laki ng code kaysa sa glibc at humigit-kumulang tumutugma sa Musl at Newlib. Upang i-optimize ang madalas na tinatawag na mga function tulad ng memcpy at strlen, ang diskarteng "trickle-down na pagganap" ay ginagamit din, kung saan ang isang macro binding ay ginagamit upang tawagan ang function, kung saan ang compiler ay alam tungkol sa mga rehistro ng CPU na kasangkot sa pagpapatupad ng code proseso, na nagpapahintulot sa pag-save ng mga mapagkukunan kapag nagse-save ng estado ng CPU sa pamamagitan ng pag-save lamang ng mga nababagong rehistro.

Kabilang sa mga pagbabago sa bagong release:

  • Ang scheme para sa pag-access ng mga panloob na mapagkukunan sa loob ng isang zip file ay nabago (kapag binubuksan ang mga file, ang karaniwang /zip/... na mga path ay ginagamit na ngayon sa halip na gamitin ang zip:.. prefix). Katulad nito, upang ma-access ang mga disk sa Windows, posibleng gumamit ng mga landas tulad ng β€œ/c/...” sa halip na β€œC:/...”.
  • Isang bagong APE (Actually Portable Executable) loader ang iminungkahi, na tumutukoy sa format ng mga unibersal na executable na file. Ang bagong loader ay gumagamit ng mmap upang ilagay ang programa sa memorya at hindi na binabago ang mga nilalaman sa mabilisang. Kung kinakailangan, ang unibersal na executable na file ay maaaring ma-convert sa mga regular na executable na file na nakatali sa mga indibidwal na platform.
  • Sa Linux platform, posibleng gamitin ang binfmt_misc kernel module para magpatakbo ng mga APE program. Napansin na ang paggamit ng binfmt_misc ay ang pinakamabilis na paraan ng paglulunsad.
  • Para sa Linux, iminungkahi ang pagpapatupad ng functionality ng pledge() at unveil() system calls na binuo ng proyekto ng OpenBSD. Ang isang API ay ibinigay para sa paggamit ng mga tawag na ito sa mga programa sa C, C++, Python at Redbean, pati na rin ang isang pledge.com na utility para sa paghihiwalay ng mga arbitrary na proseso.
  • Ang build ay gumagamit ng Landlock Make utility - isang edisyon ng GNU Make na may mas mahigpit na dependency checking at ang paggamit ng Landlock system call upang ihiwalay ang program mula sa iba pang bahagi ng system at pagbutihin ang caching efficiency. Bilang isang opsyon, ang kakayahang bumuo gamit ang regular na GNU Make ay pinananatili.
  • Naipatupad ang mga function para sa multithreading - _spawn() at _join(), na mga unibersal na binding sa mga API na partikular sa iba't ibang operating system. Nagsisimula na rin ang trabaho para ipatupad ang suporta sa POSIX Threads.
  • Posibleng gamitin ang _Thread_local na keyword upang gumamit ng hiwalay na storage para sa bawat thread (TLS, Thread-Local Storage). Bilang default, sinisimulan ng C runtime ang TLS para sa pangunahing thread, na naging dahilan upang tumaas ang minimum na laki ng executable mula 12 KB hanggang 16 KB.
  • Ang suporta para sa "--ftrace" at "--strace" na mga parameter ay idinagdag sa mga executable na file upang mag-output ng impormasyon tungkol sa lahat ng function call at system call sa stderr.
  • Nagdagdag ng suporta para sa closefrom() system call, suportado sa Linux 5.9+, FreeBSD 8+ at OpenBSD.
  • Sa Linux platform, ang pagganap ng clock_gettime at gettimeofday na mga tawag ay nadagdagan ng hanggang 10 beses sa pamamagitan ng paggamit ng vDSO (virtual dynamic shared object) na mekanismo, na ginagawang posible na ilipat ang system call handler sa user space at maiwasan ang mga switch ng konteksto.
  • Ang mga function ng matematika para sa pagtatrabaho sa mga kumplikadong numero ay inilipat mula sa Musl library. Ang gawain ng maraming mathematical function ay pinabilis.
  • Ang nointernet() function ay iminungkahi na huwag paganahin ang mga kakayahan sa network.
  • Nagdagdag ng mga bagong function para sa mahusay na pagdaragdag ng mga string: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf at vappendf.
  • Nagdagdag ng protektadong bersyon ng kprintf() na pamilya ng mga function, na idinisenyo upang gumana nang may matataas na mga pribilehiyo.
  • Kapansin-pansing pinahusay na pagganap ng mga pagpapatupad ng SSL, SHA, curve25519 at RSA.

Pinagmulan: opennet.ru

Magdagdag ng komento