Portativ icra edilə bilən fayllar üçün hazırlanmış standart C kitabxana Cosmopolitan 2.0-ın buraxılışı

Tərcüməçilərdən və virtual maşınlardan istifadə etmədən müxtəlif əməliyyat sistemləri üçün proqramları yaymaq üçün istifadə oluna bilən standart C kitabxanası və universal icra edilə bilən fayl formatını inkişaf etdirən Cosmopolitan 2.0 layihəsinin buraxılışı nəşr olundu. GCC və Clang-da tərtib etməklə əldə edilən nəticə istənilən Linux paylamasında, macOS, Windows, FreeBSD, OpenBSD, NetBSD-də işlədilə bilən və hətta BIOS-dan çağırıla bilən statik olaraq əlaqəli universal icra edilə bilən fayla yığılır. Layihə kodu ISC lisenziyası (MIT/BSD-nin sadələşdirilmiş versiyası) əsasında paylanır.

Unix, Windows və macOS-da istifadə olunan bir neçə fərqli formatı birləşdirən universal icra edilə bilən faylların yaradılması üçün konteyner müxtəlif əməliyyat sistemlərinə (PE, ELF, MACHO, OPENBSD) xas olan seqmentləri və başlıqları bir faylda birləşdirməyə əsaslanır. Tək icra olunan faylın Windows və Unix sistemlərində işləməsini təmin etmək üçün Thompson Shell-in "#!" skript markerindən istifadə etməməsindən istifadə edərək, Windows PE fayllarını qabıq skriptləri kimi kodlaşdırmaq hiylədir. Bir neçə faylı ehtiva edən proqramlar yaratmaq üçün (bütün resursları bir faylda birləşdirərək) xüsusi hazırlanmış ZIP ​​arxivi şəklində icra olunan faylın formalaşmasını dəstəkləyir. Təklif olunan formatın sxemi (misal hello.com tətbiqi):

MZqFpD='BIOS BOOT SECTOR' icra 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" 1 REAL REJİMDƏN ÇIXIN… ELF SEQMENTLƏRİ… OPENBSD QEYD… MAÇO BAŞLIQLARI… KOD VƏ MƏLUMAT… ZIP DİRAKTORİ…

Faylın əvvəlində Windows PE format başlığı kimi qəbul edilən “MZqFpD” etiketi göstərilir. Bu ardıcıllıq həmçinin “pop %r10; jno 0x4a; jo 0x4a" və "\177ELF" xətti giriş nöqtəsinə yönləndirmək üçün istifadə olunan "jg 0x47" təlimatına. Unix sistemləri icra edilə bilən kodu adsız borudan keçirərək exec əmrindən istifadə edən qabıq kodunu işlədir. Təklif olunan metodun məhdudiyyəti yalnız Thompson Shell uyğunluq rejimini dəstəkləyən qabıqlardan istifadə edərək Unix-ə bənzər əməliyyat sistemlərində işləmək imkanıdır.

qemu-x86_64 çağırışı əlavə daşınma qabiliyyətini təmin edir və x86_64 arxitekturası üçün tərtib edilmiş kodu Raspberry Pi lövhələri və ARM prosessorları ilə təchiz edilmiş Apple cihazları kimi x86 olmayan platformalarda işləməyə imkan verir. Layihə həm də əməliyyat sistemi (çılpaq metal) olmadan işləyən müstəqil proqramlar yaratmaq üçün istifadə edilə bilər. Belə proqramlarda icra olunan fayla yükləyici əlavə olunur və proqram yüklənə bilən əməliyyat sistemi kimi çıxış edir.

Layihə tərəfindən hazırlanmış standart C kitabxanası libc 2024 funksiya təklif edir (ilk buraxılışda təxminən 1400 funksiya var idi). Performans baxımından, Cosmopolitan glibc qədər sürətli işləyir və Cosmopolitan kodun ölçüsünə görə glibc-dən daha kiçik bir böyüklük sırası olmasına və təxminən Musl və Newlibə uyğun olmasına baxmayaraq, Musl və Newlib-i nəzərəçarpacaq dərəcədə qabaqlayır. Memcpy və strlen kimi tez-tez çağırılan funksiyaları optimallaşdırmaq üçün əlavə olaraq "damla-aşağı performans" texnikası istifadə olunur, burada funksiyanı çağırmaq üçün makro bağlamadan istifadə olunur və kompilyator kodun icrasında iştirak edən CPU registrləri haqqında məlumatlandırılır. prosesdir ki, bu da yalnız dəyişən registrləri saxlamaqla CPU vəziyyətinə qənaət edərkən resurslara qənaət etməyə imkan verir.

Yeni buraxılışda dəyişikliklər arasında:

  • Zip faylı daxilində daxili resurslara daxil olmaq sxemi dəyişdirilib (faylları açarkən zip:.. prefiksindən istifadə etmək əvəzinə indi adi /zip/... yollarından istifadə olunur). Eynilə, Windows-da disklərə daxil olmaq üçün “C:/...” əvəzinə “/c/...” kimi yollardan istifadə etmək mümkündür.
  • Universal icra edilə bilən faylların formatını təyin edən yeni APE (Actually Portable Executable) yükləyicisi təklif edilmişdir. Yeni yükləyici proqramı yaddaşa yerləşdirmək üçün mmap-dan istifadə edir və daha tez məzmunu dəyişmir. Lazım gələrsə, universal icra edilə bilən fayl fərdi platformalara bağlı adi icra edilə bilən fayllara çevrilə bilər.
  • Linux platformasında APE proqramlarını işə salmaq üçün binfmt_misc kernel modulundan istifadə etmək mümkündür. Qeyd olunur ki, binfmt_misc-dən istifadə ən sürətli işə salma üsuludur.
  • Linux üçün OpenBSD layihəsi tərəfindən hazırlanmış pledge() və unveil() sistem zənglərinin funksionallığının tətbiqi təklif edilmişdir. Bu zənglərdən C, C++, Python və Redbean dillərində proqramlarda istifadə etmək üçün API, eləcə də ixtiyari prosesləri təcrid etmək üçün pledge.com utiliti verilir.
  • Quraşdırma Landlock Make yardım proqramından istifadə edir - daha ciddi asılılıq yoxlanışı və proqramı sistemin qalan hissəsindən təcrid etmək və keşləmə səmərəliliyini artırmaq üçün Landlock sistemi çağırışının istifadəsi ilə GNU Make nəşri. Seçim olaraq, adi GNU Make ilə qurmaq imkanı saxlanılır.
  • Multithreading funksiyaları həyata keçirilmişdir - _spawn() və _join(), müxtəlif əməliyyat sistemlərinə xas olan API-lər üzərində universal bağlamalardır. POSIX Threads dəstəyinin tətbiqi istiqamətində də işlər aparılır.
  • Hər mövzu üçün ayrıca yaddaşdan istifadə etmək üçün _Thread_local açar sözündən istifadə etmək mümkündür (TLS, Thread-Local Storage). Varsayılan olaraq, C iş vaxtı minimum icra edilə bilən ölçüsün 12-dən 16 KB-a qədər artmasına səbəb olan əsas ip üçün TLS-ni işə salır.
  • “--ftrace” və “--strace” parametrləri üçün dəstək bütün funksiya çağırışları və stderr-ə sistem zəngləri haqqında məlumat çıxarmaq üçün icra edilə bilən fayllara əlavə edilmişdir.
  • Linux 5.9+, FreeBSD 8+ və OpenBSD-də dəstəklənən closefrom() sistem zəngi üçün əlavə dəstək.
  • Linux platformasında vDSO (virtual dinamik paylaşılan obyekt) mexanizmindən istifadə etməklə clock_gettime və gettimeofday zənglərinin performansı 10 dəfəyə qədər artırılıb ki, bu da sistem zənglərinin idarəedicisini istifadəçi sahəsinə köçürməyə və kontekst keçidlərindən qaçmağa imkan verir.
  • Mürəkkəb ədədlərlə işləmək üçün riyazi funksiyalar Musl kitabxanasından köçürülüb. Bir çox riyazi funksiyaların işi sürətləndirildi.
  • Nointernet() funksiyası şəbəkə imkanlarını söndürmək üçün təklif edilmişdir.
  • Sətirləri səmərəli şəkildə əlavə etmək üçün yeni funksiyalar əlavə edildi: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf və vappendf.
  • Yüksək imtiyazlarla işləmək üçün nəzərdə tutulmuş kprintf() funksiyalar ailəsinin qorunan versiyası əlavə edildi.
  • SSL, SHA, curve25519 və RSA tətbiqlərinin əhəmiyyətli dərəcədə təkmilləşdirilmiş performansı.

Mənbə: opennet.ru

Добавить комментарий