Keluaran perpustakaan C standard Cosmopolitan 2.0, dibangunkan untuk fail boleh laku mudah alih

Keluaran projek Cosmopolitan 2.0 telah diterbitkan, membangunkan perpustakaan C standard dan format fail boleh laku universal yang boleh digunakan untuk mengedarkan program untuk sistem pengendalian yang berbeza tanpa menggunakan penterjemah dan mesin maya. Hasil yang diperoleh dengan menyusun dalam GCC dan Clang disusun ke dalam fail boleh laku universal yang dipautkan secara statik yang boleh dijalankan pada mana-mana pengedaran Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD, dan juga dipanggil daripada BIOS. Kod projek diedarkan di bawah lesen ISC (versi ringkas MIT/BSD).

Bekas untuk menjana fail boleh laku universal adalah berdasarkan gabungan segmen dan pengepala khusus untuk sistem pengendalian yang berbeza (PE, ELF, MACHO, OPENBSD) dalam satu fail, menggabungkan beberapa format berbeza yang digunakan dalam Unix, Windows dan macOS. Untuk memastikan bahawa satu fail boleh laku dijalankan pada sistem Windows dan Unix, silap mata adalah untuk mengekod fail Windows PE sebagai skrip shell, mengambil kesempatan daripada fakta bahawa Thompson Shell tidak menggunakan penanda skrip "#!". Untuk mencipta program yang merangkumi beberapa fail (menghubungkan semua sumber ke dalam satu fail), ia menyokong pembentukan fail boleh laku dalam bentuk arkib ZIP yang direka khas. Skim format yang dicadangkan (contoh aplikasi hello.com):

MZqFpD='BIOS BOOT SECTOR' eksec 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" keluar 1 MOD SEBENAR… SEGMEN ELF… NOTA OPENBSD… TAJUK MACHO… KOD DAN DATA… DIREKTORI ZIP…

Pada permulaan fail, label "MZqFpD" ditunjukkan, yang dianggap sebagai pengepala format Windows PE. Urutan ini juga dinyahkod dalam arahan "pop %r10; jno 0x4a ; jo 0x4a", dan baris "\177ELF" kepada arahan "jg 0x47", yang digunakan untuk memajukan ke titik masuk. Sistem Unix menjalankan kod shell yang menggunakan perintah exec, menghantar kod boleh laku melalui paip yang tidak dinamakan. Had kaedah yang dicadangkan ialah keupayaan untuk dijalankan pada sistem pengendalian seperti Unix hanya menggunakan cangkerang yang menyokong mod keserasian Thompson Shell.

Panggilan qemu-x86_64 menyediakan kemudahalihan tambahan dan membenarkan kod yang disusun untuk seni bina x86_64 berjalan pada platform bukan x86, seperti papan Raspberry Pi dan peranti Apple yang dilengkapi dengan pemproses ARM. Projek ini juga boleh digunakan untuk mencipta aplikasi serba lengkap yang berjalan tanpa sistem pengendalian (logam kosong). Dalam aplikasi sedemikian, pemuat but dilampirkan pada fail boleh laku, dan program bertindak sebagai sistem pengendalian boleh boot.

Perpustakaan C standard libc yang dibangunkan oleh projek itu menawarkan 2024 fungsi (dalam keluaran pertama terdapat kira-kira 1400 fungsi). Dari segi prestasi, Cosmopolitan berfungsi sepantas glibc dan nyata mendahului Musl dan Newlib, walaupun pada hakikatnya Cosmopolitan ialah susunan magnitud yang lebih kecil dalam saiz kod daripada glibc dan lebih kurang sepadan dengan Musl dan Newlib. Untuk mengoptimumkan fungsi yang sering dipanggil seperti memcpy dan strlen, teknik "trickle-down performance" juga digunakan, di mana pengikatan makro digunakan untuk memanggil fungsi, di mana pengkompil dimaklumkan tentang daftar CPU yang terlibat dalam pelaksanaan kod. proses, yang membolehkan penjimatan sumber apabila menyimpan keadaan CPU dengan hanya menyimpan daftar boleh tukar.

Antara perubahan dalam keluaran baharu:

  • Skim untuk mengakses sumber dalaman dalam fail zip telah diubah (apabila membuka fail, laluan /zip/... biasa kini digunakan dan bukannya menggunakan awalan zip:..). Begitu juga, untuk mengakses cakera dalam Windows, adalah mungkin untuk menggunakan laluan seperti β€œ/c/...” dan bukannya β€œC:/...”.
  • Pemuat APE (Actually Portable Executable) baharu telah dicadangkan, yang mentakrifkan format fail boleh laku universal. Pemuat baharu menggunakan mmap untuk meletakkan atur cara dalam ingatan dan tidak lagi mengubah kandungan dengan cepat. Jika perlu, fail boleh laku universal boleh ditukar kepada fail boleh laku biasa yang terikat pada platform individu.
  • Pada platform Linux, adalah mungkin untuk menggunakan modul kernel binfmt_misc untuk menjalankan program APE. Adalah diperhatikan bahawa menggunakan binfmt_misc adalah kaedah pelancaran terpantas.
  • Untuk Linux, pelaksanaan kefungsian panggilan sistem pledge() dan unveil() yang dibangunkan oleh projek OpenBSD telah dicadangkan. API disediakan untuk menggunakan panggilan ini dalam program dalam C, C++, Python dan Redbean, serta utiliti pledge.com untuk mengasingkan proses sewenang-wenangnya.
  • Binaan menggunakan utiliti Landlock Make - edisi GNU Make dengan semakan pergantungan yang lebih ketat dan penggunaan panggilan sistem Landlock untuk mengasingkan atur cara daripada sistem yang lain dan meningkatkan kecekapan caching. Sebagai pilihan, keupayaan untuk membina dengan GNU Make biasa dikekalkan.
  • Fungsi untuk multithreading telah dilaksanakan - _spawn() dan _join(), yang merupakan pengikatan universal ke atas API khusus untuk sistem pengendalian yang berbeza. Kerja-kerja juga sedang dijalankan untuk melaksanakan sokongan POSIX Threads.
  • Anda boleh menggunakan kata kunci _Thread_local untuk menggunakan storan berasingan untuk setiap utas (TLS, Storan Tempatan Benang). Secara lalai, masa jalan C memulakan TLS untuk utas utama, yang telah menyebabkan saiz boleh laku minimum meningkat daripada 12 KB kepada 16 KB.
  • Sokongan untuk parameter "--ftrace" dan "--strace" telah ditambahkan pada fail boleh laku untuk mengeluarkan maklumat tentang semua panggilan fungsi dan panggilan sistem kepada stderr.
  • Menambah sokongan untuk panggilan sistem closefrom(), disokong pada Linux 5.9+, FreeBSD 8+ dan OpenBSD.
  • Pada platform Linux, prestasi panggilan clock_gettime dan gettimeofday telah ditingkatkan sehingga 10 kali dengan menggunakan mekanisme vDSO (objek kongsi dinamik maya), yang memungkinkan untuk mengalihkan pengendali panggilan sistem ke ruang pengguna dan mengelakkan suis konteks.
  • Fungsi matematik untuk bekerja dengan nombor kompleks telah dialihkan dari perpustakaan Musl. Kerja banyak fungsi matematik telah dipercepatkan.
  • Fungsi nointernet() telah dicadangkan untuk melumpuhkan keupayaan rangkaian.
  • Menambah fungsi baharu untuk menambahkan rentetan dengan cekap: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf dan vappendf.
  • Menambahkan versi terlindung bagi keluarga fungsi kprintf(), yang direka untuk berfungsi dengan keistimewaan yang tinggi.
  • Prestasi SSL, SHA, curve25519 dan RSA yang dipertingkatkan dengan ketara.

Sumber: opennet.ru

Tambah komen