Portativ bajariladigan fayllar uchun ishlab chiqilgan Cosmopolitan 2.0 standart C kutubxonasining chiqarilishi

Cosmopolitan 2.0 loyihasining chiqarilishi e'lon qilindi, u standart C kutubxonasini va tarjimonlar va virtual mashinalardan foydalanmasdan turli xil operatsion tizimlar uchun dasturlarni tarqatish uchun ishlatilishi mumkin bo'lgan universal bajariladigan fayl formatini ishlab chiqdi. GCC va Clang-da kompilyatsiya qilish natijasida olingan natija har qanday Linux tarqatish, macOS, Windows, FreeBSD, OpenBSD, NetBSD-da ishlashi va hatto BIOS-dan chaqirilishi mumkin bo'lgan statik bog'langan universal bajariladigan faylga kompilyatsiya qilinadi. Loyiha kodi ISC litsenziyasi (MIT/BSD ning soddalashtirilgan versiyasi) ostida tarqatiladi.

Unix, Windows va macOS da qo'llaniladigan bir nechta turli formatlarni birlashtirgan holda, universal bajariladigan fayllarni yaratish uchun konteyner turli xil operatsion tizimlarga (PE, ELF, MACHO, OPENBSD) xos segmentlar va sarlavhalarni bir faylda birlashtirishga asoslangan. Bitta bajariladigan fayl Windows va Unix tizimlarida ishlashini ta'minlash uchun Thompson Shell "#!" skript belgisini ishlatmasligidan foydalanib, Windows PE fayllarini qobiq skriptlari sifatida kodlash hiylasidan iborat. Bir nechta fayllarni o'z ichiga olgan dasturlarni yaratish uchun (barcha resurslarni bitta faylga bog'lash) u maxsus ishlab chiqilgan ZIP arxivi ko'rinishida bajariladigan faylni shakllantirishni qo'llab-quvvatlaydi. Taklif etilgan formatning sxemasi (misol hello.com ilovasi):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(buyruq -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" 1 REAL REJIMdan chiqish… ELF SEGMENTLARI… OPENBSD QAYD… MACHO SARLIKLARI… KOD VA MA’LUMOT… ZIP MA’LUMOT…

Fayl boshida "MZqFpD" yorlig'i ko'rsatilgan, bu Windows PE formatidagi sarlavha sifatida qabul qilinadi. Bu ketma-ketlik “pop %r10; jno 0x4a; jo 0x4a" va "\177ELF" qatori "jg 0x47" yo'riqnomasiga, kirish nuqtasiga yo'naltirish uchun ishlatiladi. Unix tizimlari bajariladigan kodni nomsiz quvur orqali uzatuvchi exec buyrug'idan foydalanadigan qobiq kodini ishga tushiradi. Taklif etilgan usulning cheklovi Unix-ga o'xshash operatsion tizimlarda faqat Thompson Shell moslik rejimini qo'llab-quvvatlaydigan qobiqlardan foydalangan holda ishlash qobiliyatidir.

Qemu-x86_64 qo'ng'irog'i qo'shimcha portativlikni ta'minlaydi va x86_64 arxitekturasi uchun tuzilgan kodni x86 bo'lmagan platformalarda, masalan, Raspberry Pi platalarida va ARM protsessorlari bilan jihozlangan Apple qurilmalarida ishlashga imkon beradi. Loyiha, shuningdek, operatsion tizimsiz (yalang'och metall) ishlaydigan mustaqil dasturlarni yaratish uchun ham ishlatilishi mumkin. Bunday ilovalarda bajariladigan faylga yuklovchi biriktiriladi va dastur yuklanadigan operatsion tizim vazifasini bajaradi.

Loyiha tomonidan ishlab chiqilgan standart C kutubxonasi libc 2024 ta funksiyani taklif etadi (birinchi versiyada 1400 ga yaqin funksiya mavjud edi). Ishlash nuqtai nazaridan, Cosmopolitan glibc kabi tez ishlaydi va Cosmopolitan kod hajmi bo'yicha glibcga qaraganda kichikroq va taxminan Musl va Newlibga mos kelishiga qaramay, Musl va Newlibdan sezilarli darajada oldinda. Memcpy va strlen kabi tez-tez chaqiriladigan funktsiyalarni optimallashtirish uchun qo'shimcha ravishda "damlamali ishlash" texnikasi qo'llaniladi, bunda funktsiyani chaqirish uchun so'l bog'lash qo'llaniladi, bunda kompilyator kodni bajarishda ishtirok etadigan CPU registrlari haqida xabardor qilinadi. jarayon, bu faqat o'zgaruvchan registrlarni saqlash orqali CPU holatini saqlashda resurslarni tejash imkonini beradi.

Yangi versiyadagi o'zgarishlar quyidagilardan iborat:

  • Zip fayl ichidagi ichki resurslarga kirish sxemasi o'zgartirildi (fayllarni ochishda endi zip:.. prefiksidan foydalanish o'rniga odatiy /zip/... yo'llari qo'llaniladi). Xuddi shunday, Windows-da disklarga kirish uchun "C:/..." o'rniga "/c/..." kabi yo'llardan foydalanish mumkin.
  • Universal bajariladigan fayllar formatini belgilaydigan yangi APE (Actually Portable Executable) yuklagichi taklif qilindi. Yangi yuklovchi dasturni xotiraga joylashtirish uchun mmap-dan foydalanadi va endi tarkibni tezda o'zgartirmaydi. Agar kerak bo'lsa, universal bajariladigan fayl alohida platformalarga bog'langan oddiy bajariladigan fayllarga aylantirilishi mumkin.
  • Linux platformasida APE dasturlarini ishga tushirish uchun binfmt_misc yadro modulidan foydalanish mumkin. Ta'kidlanishicha, binfmt_misc dan foydalanish eng tez ishga tushirish usuli hisoblanadi.
  • Linux uchun OpenBSD loyihasi tomonidan ishlab chiqilgan pledge() va unveil() tizim qo'ng'iroqlarining funksionalligini amalga oshirish taklif qilingan. Ushbu qo'ng'iroqlarni C, C++, Python va Redbean dasturlarida ishlatish uchun API, shuningdek, o'zboshimchalik bilan jarayonlarni izolyatsiya qilish uchun pledge.com yordam dasturi taqdim etiladi.
  • Qurilishda Landlock Make yordam dasturidan foydalaniladi - GNU Make-ning yanada qat'iy qaramlik tekshiruvi va dasturni tizimning qolgan qismidan ajratish va keshlash samaradorligini oshirish uchun Landlock tizimi chaqiruvidan foydalanish. Variant sifatida oddiy GNU Make bilan qurish imkoniyati saqlanib qoladi.
  • Multithreading uchun funksiyalar amalga oshirildi - _spawn() va _join(), ular turli xil operatsion tizimlarga xos bo'lgan API-lar ustidan universal bog'lanishdir. POSIX Threads qo‘llab-quvvatlashini joriy etish bo‘yicha ham ishlar olib borilmoqda.
  • Har bir mavzu uchun alohida xotiradan foydalanish uchun _Thread_local kalit so'zidan foydalanish mumkin (TLS, Thread-Local Storage). Odatiy bo'lib, C ish vaqti asosiy oqim uchun TLS ni ishga tushiradi, bu esa bajariladigan minimal hajmning 12 dan 16 KB gacha oshishiga olib keldi.
  • "--ftrace" va "--strace" parametrlarini qo'llab-quvvatlash stderr-ga barcha funktsiya chaqiruvlari va tizim qo'ng'iroqlari haqidagi ma'lumotlarni chiqarish uchun bajariladigan fayllarga qo'shildi.
  • Linux 5.9+, FreeBSD 8+ va OpenBSD da qoʻllab-quvvatlanadigan closefrom() tizim qoʻngʻirogʻi uchun qoʻshimcha yordam.
  • Linux platformasida clock_gettime va gettimeofday qo'ng'iroqlarining unumdorligi vDSO (virtual dinamik umumiy ob'ekt) mexanizmidan foydalangan holda 10 baravargacha oshirildi, bu tizim qo'ng'iroqlarini qayta ishlash moslamasini foydalanuvchi maydoniga ko'chirish va kontekstni almashtirishdan qochish imkonini beradi.
  • Murakkab sonlar bilan ishlash uchun matematik funksiyalar Musl kutubxonasidan koʻchirildi. Ko'pgina matematik funktsiyalarning ishi tezlashdi.
  • Tarmoq imkoniyatlarini o'chirish uchun nointernet() funksiyasi taklif qilingan.
  • Satrlarni samarali qo'shish uchun yangi funksiyalar qo'shildi: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf va vappendf.
  • Yuqori imtiyozlar bilan ishlash uchun mo'ljallangan kprintf() funktsiyalar oilasining himoyalangan versiyasi qo'shildi.
  • SSL, SHA, curve25519 va RSA ilovalarining ishlashi sezilarli darajada yaxshilandi.

Manba: opennet.ru

a Izoh qo'shish