Портативті орындалатын файлдар үшін әзірленген Cosmopolitan 2.0 стандартты C кітапханасының шығарылымы

Cosmopolitan 2.0 жобасының шығарылымы жарияланды, ол стандартты C кітапханасын және интерпретаторларды және виртуалды машиналарды қолданбай әртүрлі операциялық жүйелерге арналған бағдарламаларды тарату үшін пайдалануға болатын әмбебап орындалатын файл пішімін әзірледі. GCC және Clang жүйесінде компиляциялау арқылы алынған нәтиже кез келген Linux дистрибутивінде, macOS, Windows, FreeBSD, OpenBSD, NetBSD-де іске қосуға және тіпті BIOS-тан шақыруға болатын статикалық байланысты әмбебап орындалатын файлға жинақталады. Жоба коды ISC лицензиясы бойынша таратылады (MIT/BSD жеңілдетілген нұсқасы).

Әмбебап орындалатын файлдарды генерациялауға арналған контейнер Unix, Windows және macOS жүйелерінде қолданылатын бірнеше түрлі пішімдерді біріктіретін әртүрлі операциялық жүйелерге (PE, ELF, MACHO, OPENBSD) тән сегменттер мен тақырыптарды біріктіруге негізделген. Бір орындалатын файл Windows және Unix жүйелерінде жұмыс істейтініне көз жеткізу үшін Thompson Shell «#!» сценарий маркерін пайдаланбайтындығын пайдаланып, Windows PE файлдарын қабық сценарийлері ретінде кодтау болып табылады. Бірнеше файлдарды қамтитын бағдарламаларды жасау үшін (барлық ресурстарды бір файлға байланыстыру) ол арнайы әзірленген ZIP мұрағаты түріндегі орындалатын файлды қалыптастыруды қолдайды. Ұсынылған форматтың схемасы (мысалы, hello.com қосымшасы):

MZqFpD='BIOS BOOT SECTOR' орындау 7 $(пәрмен -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" exit 1 REAL РЕЖИМ… ELF SEGMENTS… OPENBSD ЕСКЕРТПЕСІ… MACHO ТАҚЫРЫПТАРЫ… КОД ЖӘНЕ ДЕРЕКТЕР… ZIP КАТАТАУЫ…

Файлдың басында «MZqFpD» белгісі көрсетілген, ол Windows PE пішімінің тақырыбы ретінде қабылданады. Бұл реттілік «pop %r10; jno 0x4a; jo 0x4a", және "\177ELF" жолы "jg 0x47" нұсқауына, олар кіру нүктесіне бағыттау үшін пайдаланылады. Unix жүйелері орындалатын кодты атаусыз құбыр арқылы өткізетін exec пәрменін пайдаланатын қабық кодын іске қосады. Ұсынылған әдістің шектеуі тек Thompson Shell үйлесімділік режимін қолдайтын қабықшаларды пайдаланып, Unix тәрізді операциялық жүйелерде жұмыс істеу мүмкіндігі болып табылады.

qemu-x86_64 қоңырауы қосымша тасымалдануды қамтамасыз етеді және x86_64 архитектурасы үшін құрастырылған кодты ARM процессорларымен жабдықталған Raspberry Pi тақталары және Apple құрылғылары сияқты x86 емес платформаларда іске қосуға мүмкіндік береді. Жобаны операциялық жүйесіз (жалаңаш металл) жұмыс істейтін дербес қолданбаларды жасау үшін де пайдалануға болады. Мұндай қолданбаларда жүктеуші орындалатын файлға тіркеледі, ал бағдарлама жүктелетін операциялық жүйе ретінде әрекет етеді.

Жоба әзірлеген стандартты C кітапханасы libc 2024 функцияны ұсынады (бірінші шығарылымда шамамен 1400 функция болды). Өнімділік тұрғысынан Cosmopolitan glibc сияқты жылдам жұмыс істейді және Cosmopolitan код өлшемі бойынша glibc-ке қарағанда кішірек және шамамен Мусл мен Ньюлибке сәйкес келетініне қарамастан, Мусл мен Ньюлибтен айтарлықтай алда. Memcpy және strlen сияқты жиі шақырылатын функцияларды оңтайландыру үшін функцияны шақыру үшін макросты байланыстыру қолданылатын, компилятор кодты орындауға қатысатын орталық процессор регистрлері туралы хабардар ететін «тамшылау өнімділігі» әдісі қосымша қолданылады. процесс, ол тек өзгеретін регистрлерді сақтау арқылы CPU күйін сақтау кезінде ресурстарды үнемдеуге мүмкіндік береді.

Жаңа шығарылымдағы өзгерістердің арасында:

  • Zip файлының ішіндегі ішкі ресурстарға қол жеткізу схемасы өзгертілді (файлдарды ашқанда, енді zip:.. префиксін пайдаланудың орнына әдеттегі /zip/... жолдары пайдаланылады). Сол сияқты, Windows жүйесінде дискілерге қол жеткізу үшін «C:/...» орнына «/c/...» сияқты жолдарды пайдалануға болады.
  • Әмбебап орындалатын файлдардың пішімін анықтайтын жаңа APE (Actually Portable Executable) жүктеушісі ұсынылды. Жаңа жүктеуші бағдарламаны жадқа орналастыру үшін mmap пайдаланады және енді мазмұнды жылдам өзгертпейді. Қажет болса, әмбебап орындалатын файлды жеке платформаларға байланыстырылған кәдімгі орындалатын файлдарға түрлендіруге болады.
  • Linux платформасында APE бағдарламаларын іске қосу үшін binfmt_misc ядро ​​модулін пайдалануға болады. Binfmt_misc пайдалану ең жылдам іске қосу әдісі екені атап өтілген.
  • Linux үшін OpenBSD жобасы әзірлеген pledge() және unveil() жүйелік шақыруларының функционалдығын іске асыру ұсынылды. Бұл қоңырауларды C, C++, Python және Redbean бағдарламаларында пайдалану үшін API, сондай-ақ ерікті процестерді оқшаулауға арналған pledge.com утилитасы ұсынылады.
  • Құрастыру Landlock Make утилитасын пайдаланады - GNU Make басылымы неғұрлым қатаң тәуелділікті тексереді және бағдарламаны жүйенің қалған бөлігінен оқшаулау және кэштеу тиімділігін арттыру үшін Landlock жүйесінің шақыруын пайдалану. Опция ретінде әдеттегі GNU Make көмегімен құру мүмкіндігі сақталады.
  • Көп ағынға арналған функциялар іске асырылды - _spawn() және _join(), олар әртүрлі операциялық жүйелерге тән API интерфейстері бойынша әмбебап байланыстар болып табылады. Сондай-ақ POSIX Threads қолдауын енгізу бойынша жұмыстар жүргізілуде.
  • Әрбір ағын үшін бөлек жадты пайдалану үшін _Thread_local кілт сөзін пайдалануға болады (TLS, Thread-Local Storage). Әдепкі бойынша, C орындалу уақыты ең төменгі орындалатын өлшемнің 12-ден 16 КБ-қа дейін ұлғаюына әкелетін негізгі ағын үшін TLS инициализациялайды.
  • «--ftrace» және «--strace» параметрлеріне қолдау stderr-ге барлық функция шақырулары мен жүйелік шақырулар туралы ақпаратты шығару үшін орындалатын файлдарға қосылды.
  • Linux 5.9+, FreeBSD 8+ және OpenBSD жүйелерінде қолдау көрсетілетін closefrom() жүйелік қоңырауына қолдау қосылды.
  • Linux платформасында clock_gettime және gettimeofday қоңырауларының өнімділігі vDSO (виртуалды динамикалық ортақ нысан) механизмін пайдалану арқылы 10 есеге дейін ұлғайтылды, бұл жүйелік қоңырау өңдегішін пайдаланушы кеңістігіне жылжытуға және контекстік ауыстырып-қосқыштарды болдырмауға мүмкіндік береді.
  • Комплекс сандармен жұмыс істеуге арналған математикалық функциялар Musl кітапханасынан көшірілді. Көптеген математикалық функциялардың жұмысы жеделдетілді.
  • nointernet() функциясы желі мүмкіндіктерін өшіру үшін ұсынылған.
  • Жолдарды тиімді қосу үшін жаңа функциялар қосылды: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf және vappendf.
  • Жоғары артықшылықтармен жұмыс істеуге арналған kprintf() функциялар тобының қорғалған нұсқасы қосылды.
  • SSL, SHA, curve25519 және RSA енгізулерінің өнімділігі айтарлықтай жақсарды.

Ақпарат көзі: opennet.ru

пікір қалдыру