Rilis perpustakaan C standar Cosmopolitan 2.0, dikembangkan untuk file portabel yang dapat dieksekusi

Rilis proyek Cosmopolitan 2.0 telah diterbitkan, mengembangkan perpustakaan C standar dan format file universal yang dapat dieksekusi yang dapat digunakan untuk mendistribusikan program untuk sistem operasi yang berbeda tanpa menggunakan penerjemah dan mesin virtual. Hasil yang diperoleh dari kompilasi di GCC dan Dentang dikompilasi menjadi file universal yang dapat dieksekusi yang terhubung secara statis yang dapat dijalankan di distribusi Linux apa pun, macOS, Windows, FreeBSD, OpenBSD, NetBSD, dan bahkan dipanggil dari BIOS. Kode proyek didistribusikan di bawah lisensi ISC (versi sederhana dari MIT/BSD).

Wadah untuk menghasilkan file universal yang dapat dieksekusi didasarkan pada penggabungan segmen dan header khusus untuk sistem operasi yang berbeda (PE, ELF, MACHO, OPENBSD) dalam satu file, menggabungkan beberapa format berbeda yang digunakan di Unix, Windows dan macOS. Untuk memastikan bahwa satu file yang dapat dieksekusi berjalan pada sistem Windows dan Unix, triknya adalah dengan mengkodekan file Windows PE sebagai skrip shell, mengambil keuntungan dari fakta bahwa Thompson Shell tidak menggunakan penanda skrip "#!". Untuk membuat program yang menyertakan beberapa file (menghubungkan semua sumber daya ke dalam satu file), mendukung pembentukan file yang dapat dieksekusi dalam bentuk arsip ZIP yang dirancang khusus. Skema format yang diusulkan (contoh aplikasi hello.com):

MZqFpD='BIOS BOOT SEKTOR' exec 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" exit 1 REAL MODE… SEGMEN ELF… CATATAN OPENBSD… HEADER MACHO… KODE DAN DATA… DIREKTORI ZIP…

Di awal file, label "MZqFpD" ditunjukkan, yang dianggap sebagai header format Windows PE. Urutan ini juga diterjemahkan dalam instruksi β€œpop %r10; jno 0x4a ; jo 0x4a", dan baris "\177ELF" ke instruksi "jg 0x47", yang digunakan untuk meneruskan ke titik masuk. Sistem Unix menjalankan kode shell yang menggunakan perintah exec, meneruskan kode yang dapat dieksekusi melalui pipa yang tidak disebutkan namanya. Keterbatasan metode yang diusulkan adalah kemampuan untuk berjalan pada sistem operasi mirip Unix hanya menggunakan shell yang mendukung mode kompatibilitas Thompson Shell.

Panggilan qemu-x86_64 memberikan portabilitas tambahan dan memungkinkan kode yang dikompilasi untuk arsitektur x86_64 berjalan pada platform non-x86, seperti papan Raspberry Pi dan perangkat Apple yang dilengkapi dengan prosesor ARM. Proyek ini juga dapat digunakan untuk membuat aplikasi mandiri yang berjalan tanpa sistem operasi (bare metal). Dalam aplikasi tersebut, bootloader dilampirkan ke file yang dapat dieksekusi, dan program bertindak sebagai sistem operasi yang dapat di-boot.

Libc perpustakaan C standar yang dikembangkan oleh proyek ini menawarkan 2024 fungsi (dalam rilis pertama ada sekitar 1400 fungsi). Dalam hal kinerja, Cosmopolitan bekerja secepat glibc dan jauh lebih unggul dari Musl dan Newlib, meskipun faktanya Cosmopolitan memiliki ukuran kode yang jauh lebih kecil daripada glibc dan kira-kira sama dengan Musl dan Newlib. Untuk mengoptimalkan fungsi yang sering dipanggil seperti memcpy dan strlen, teknik "kinerja trickle-down" juga digunakan, di mana pengikatan makro digunakan untuk memanggil fungsi tersebut, di mana kompiler diberi tahu tentang register CPU yang terlibat dalam eksekusi kode proses, yang memungkinkan penghematan sumber daya saat menyimpan status CPU dengan hanya menyimpan register yang dapat diubah.

Perubahan dalam rilis baru meliputi:

  • Skema untuk mengakses sumber daya internal di dalam file zip telah diubah (saat membuka file, jalur /zip/... yang biasa sekarang digunakan alih-alih menggunakan awalan zip:..). Demikian pula, untuk mengakses disk di Windows, dimungkinkan untuk menggunakan jalur seperti β€œ/c/...” alih-alih β€œC:/...”.
  • Loader APE (Actually Portable Executable) baru telah diusulkan, yang menentukan format file universal yang dapat dieksekusi. Pemuat baru menggunakan mmap untuk menempatkan program di memori dan tidak lagi mengubah konten dengan cepat. Jika perlu, file yang dapat dieksekusi universal dapat diubah menjadi file yang dapat dieksekusi biasa yang terkait dengan platform individual.
  • Pada platform Linux, modul kernel binfmt_misc dapat digunakan untuk menjalankan program APE. Perlu dicatat bahwa menggunakan binfmt_misc adalah metode peluncuran tercepat.
  • Untuk Linux, implementasi fungsi panggilan sistem Pledge() dan Unveil() yang dikembangkan oleh proyek OpenBSD telah diusulkan. API disediakan untuk menggunakan panggilan ini dalam program di C, C++, Python dan Redbean, serta utilitas Pledge.com untuk mengisolasi proses arbitrer.
  • Pembangunannya menggunakan utilitas Landlock Make - edisi GNU Make dengan pemeriksaan ketergantungan yang lebih ketat dan penggunaan panggilan sistem Landlock untuk mengisolasi program dari sistem lainnya dan meningkatkan efisiensi caching. Sebagai opsi, kemampuan untuk membangun dengan GNU Make reguler tetap dipertahankan.
  • Fungsi untuk multithreading telah diterapkan - _spawn() dan _join(), yang merupakan pengikatan universal pada API khusus untuk sistem operasi yang berbeda. Pekerjaan juga sedang dilakukan untuk mengimplementasikan dukungan POSIX Threads.
  • Dimungkinkan untuk menggunakan kata kunci _Thread_local untuk menggunakan penyimpanan terpisah untuk setiap thread (TLS, Thread-Local Storage). Secara default, runtime C menginisialisasi TLS untuk thread utama, yang menyebabkan ukuran minimum yang dapat dieksekusi meningkat dari 12 KB menjadi 16 KB.
  • Dukungan untuk parameter β€œ--ftrace” dan β€œ--strace” telah ditambahkan ke file yang dapat dieksekusi untuk menampilkan informasi tentang semua panggilan fungsi dan panggilan sistem ke stderr.
  • Menambahkan dukungan untuk panggilan sistem closefrom(), didukung di Linux 5.9+, FreeBSD 8+ dan OpenBSD.
  • Pada platform Linux, kinerja panggilan clock_gettime dan gettimeofday telah ditingkatkan hingga 10 kali lipat dengan menggunakan mekanisme vDSO (virtual Dynamic Shared Object), yang memungkinkan untuk memindahkan pengendali panggilan sistem ke ruang pengguna dan menghindari peralihan konteks.
  • Fungsi matematika untuk bekerja dengan bilangan kompleks telah dipindahkan dari perpustakaan Musl. Pekerjaan banyak fungsi matematika telah dipercepat.
  • Fungsi nointernet() telah diusulkan untuk menonaktifkan kemampuan jaringan.
  • Menambahkan fungsi baru untuk menambahkan string secara efisien: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf, dan vappendf.
  • Menambahkan versi rangkaian fungsi kprintf() yang dilindungi, dirancang untuk bekerja dengan hak istimewa yang lebih tinggi.
  • Meningkatkan kinerja implementasi SSL, SHA, curve25519 dan RSA secara signifikan.

Sumber: opennet.ru

Tambah komentar