Ngaleupaskeun perpustakaan C standar Cosmopolitan 2.0, dikembangkeun pikeun file laksana portabel

Pelepasan proyék Cosmopolitan 2.0 parantos diterbitkeun, ngembangkeun perpustakaan C standar sareng format file anu tiasa dieksekusi universal anu tiasa dianggo pikeun ngadistribusikaeun program pikeun sistem operasi anu béda tanpa nganggo juru sareng mesin virtual. Hasilna diala ku compiling dina GCC na Clang ieu disusun kana statically numbu file laksana universal nu bisa dijalankeun dina sagala distribusi Linux Ubuntu, macOS, Windows, FreeBSD, OpenBSD, NetBSD, komo disebut ti BIOS. Kodeu proyék disebarkeun dina lisénsi ISC (versi saderhana tina MIT / BSD).

Wadah pikeun ngahasilkeun file laksana universal didasarkeun kana ngagabungkeun bagéan sareng header khusus pikeun sistem operasi anu béda (PE, ELF, MACHO, OPENBSD) dina hiji file, ngagabungkeun sababaraha format anu béda anu dianggo dina Unix, Windows sareng macOS. Pikeun mastikeun yén hiji file executable dijalankeun dina sistem Windows jeung Unix, hiji trik pikeun encode file Windows PE salaku skrip cangkang, ngamangpaatkeun kanyataan yén Thompson Shell teu make "#!" spidol Aksara. Pikeun nyiptakeun program anu kalebet sababaraha file (ngahubungkeun sadaya sumber kana hiji file), éta ngadukung formasi file anu tiasa dieksekusi dina bentuk arsip ZIP anu dirancang khusus. Skéma format anu diusulkeun (conto aplikasi hello.com):

MZqFpD = 'BIOS BOOT SECTOR' exec 7 $(paréntah -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" kaluar 1 MODE NYATA... SEGMEN ELF... CATETAN OPENBSD... MACHO HEADER... KODE JEUNG DATA... DIREKTORI ZIP...

Dina awal file, labél "MZqFpD" dituduhkeun, anu dianggap salaku header format Windows PE. Runtuyan ieu ogé dikodekeun dina paréntah "pop% r10; jno 0x4a ; jo 0x4a", sarta garis "\ 177ELF" kana parentah "jg 0x47", nu dipaké pikeun maju ka titik Éntri. Sistem Unix ngajalankeun kode cangkang anu ngagunakeun paréntah exec, ngalirkeun kodeu laksana ngaliwatan pipa unnamed. Watesan metode anu diusulkeun nyaéta kamampuan pikeun ngajalankeun sistem operasi sapertos Unix ngan nganggo cangkang anu ngadukung modeu kasaluyuan Thompson Shell.

Telepon qemu-x86_64 nyayogikeun portabilitas tambahan sareng ngamungkinkeun kode anu disusun pikeun arsitektur x86_64 tiasa dijalankeun dina platform non-x86, sapertos papan Raspberry Pi sareng alat Apple anu dilengkepan prosesor ARM. Proyék ogé tiasa dianggo pikeun nyiptakeun aplikasi mandiri anu ngajalankeun tanpa sistem operasi (logam bulistir). Dina aplikasi sapertos kitu, bootloader digantelkeun kana file anu tiasa dieksekusi, sareng programna janten sistem operasi anu tiasa di-boot.

Perpustakaan C baku libc dikembangkeun ku proyék nawarkeun 2024 fungsi (dina release munggaran aya ngeunaan 1400 fungsi). Dina hal kinerja, Cosmopolitan jalan gancang sakumaha glibc tur noticeably dihareupeun Musl na Newlib, sanajan kanyataan yén Cosmopolitan mangrupa urutan gedena leuwih leutik dina ukuran kode ti glibc tur kira pakait jeung Musl na Newlib. Pikeun ngaoptimalkeun fungsi anu sering disebut sapertos memcpy sareng strlen, téknik "trickle-down performance" ogé dianggo, dimana beungkeutan makro dianggo pikeun nyauran fungsi, dimana kompiler diinformasikeun ngeunaan registers CPU aub dina palaksanaan kode. prosés, anu ngamungkinkeun nyimpen sumberdaya nalika nyimpen kaayaan CPU ku nyimpen ngan registers robah-robah.

Diantara parobihan dina sékrési énggal:

  • Skéma pikeun ngakses sumberdaya internal dina file pos geus robah (nalika muka file, jalur / zip / ... biasa ayeuna dipaké tinimbang ngagunakeun zip: .. awalan). Nya kitu, pikeun ngakses disk dina Windows, kasebut nyaéta dimungkinkeun pikeun ngagunakeun jalur kawas "/ c / ..." tinimbang "C: / ...".
  • APE anyar (Sabenerna Portable Executable) loader geus diajukeun, nu nangtukeun format file laksana universal. The loader anyar migunakeun mmap pikeun nempatkeun program dina mémori jeung euweuh ngarobah eusi dina laleur nu. Upami diperlukeun, file executable universal bisa dirobah jadi file laksana biasa dihijikeun ka platform individu.
  • Dina platform Linux, anjeun tiasa nganggo modul kernel binfmt_misc pikeun ngajalankeun program APE. Perhatikeun yén ngagunakeun binfmt_misc mangrupikeun metode peluncuran anu paling gancang.
  • Pikeun Linux Ubuntu, hiji palaksanaan fungsionalitas ikrar () sarta unveil () nelepon sistem dikembangkeun ku proyék OpenBSD geus diajukeun. API disayogikeun pikeun ngagunakeun telepon ieu dina program dina C, C ++, Python sareng Redbean, ogé utilitas pledge.com pikeun ngasingkeun prosés sawenang-wenang.
  • Wangunanna nganggo utilitas Landlock Make - édisi GNU Make kalayan pamariksaan kagumantungan anu langkung ketat sareng panggunaan panggero sistem Landlock pikeun ngasingkeun program tina sistem anu sanés sareng ningkatkeun efisiensi cache. Salaku pilihan, kamampuan ngawangun sareng GNU Make biasa dipikagaduh.
  • Fungsi pikeun multithreading geus dilaksanakeun - _spawn () sarta _join (), nu bindings universal leuwih API husus pikeun sistem operasi béda. Usaha ogé dilaksanakeun pikeun ngalaksanakeun pangrojong POSIX Threads.
  • Kasebut nyaéta dimungkinkeun pikeun ngagunakeun _Thread_local keyword pikeun pamakéan gudang misah pikeun tiap thread (TLS, Thread-Local Storage). Sacara standar, runtime C ngamimitian TLS pikeun utas utama, anu nyababkeun ukuran laksana minimum naék tina 12 KB ka 16 KB.
  • Rojongan pikeun parameter "--ftrace" jeung "--strace" geus ditambahkeun kana file executable mun informasi kaluaran ngeunaan sakabéh panggero fungsi sarta panggero sistem pikeun stderr.
  • Ditambahkeun dukungan pikeun panggero sistem closefrom (), dirojong dina Linux 5.9+, FreeBSD 8+ sareng OpenBSD.
  • Dina platform Linux, kinerja clock_gettime sareng gettimeofday télépon parantos ningkat dugi ka 10 kali ku ngagunakeun mékanisme vDSO (virtual dynamic shared object), anu ngamungkinkeun pikeun mindahkeun panangan telepon sistem ka rohangan pangguna sareng ngahindarkeun saklar konteks.
  • Fungsi matematik pikeun gawé bareng wilangan kompléks geus dipindahkeun ti perpustakaan Musl. Karya seueur fungsi matematika parantos digancangan.
  • Fungsi nointernet () geus diajukeun pikeun nganonaktipkeun kamampuhan jaringan.
  • Ditambahkeun fungsi anyar pikeun éfisién appending string: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf na vappendf.
  • Ditambahkeun versi ditangtayungan tina kprintf () kulawarga fungsi, dirancang pikeun gawé kalawan statusna elevated.
  • Ningkatkeun kinerja SSL, SHA, curve25519 sareng RSA sacara signifikan.

sumber: opennet.ru

Tambahkeun komentar