Выпуск стандартнай Сі-бібліятэкі Cosmopolitan 2.0, якая развіваецца для пераносных выкананых файлаў

Апублікаваны выпуск праекта Cosmopolitan 2.0, які развівае стандартную Сі-бібліятэку і ўніверсальны фармат выкананых файлаў, які можна выкарыстоўваць для распаўсюджвання праграм для розных аперацыйных сістэм без выкарыстання інтэрпрэтатараў і віртуальных машын. Атрымоўваны пры дапамозе кампіляцыі ў GCC і Clang вынік кампануецца ў статычна злучаны ўніверсальны выкананы файл, які прыдатны для запуску ў любым дыстрыбутыве Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD і нават выкліку з BIOS. Код праекту распаўсюджваецца пад ліцэнзіяй ISC (спрошчаны варыянт MIT/BSD).

Кантэйнер для фармавання ўніверсальных выкананых файлаў заснаваны на сумяшчэнні спецыфічных для розных аперацыйных сістэм сегментаў і загалоўкаў (PE, ELF, MACHO, OPENBSD) у адным файле, камбінуючы ў ім некалькі розных фарматаў, выкарыстоўваных у Unix, Windows і macOS. Для забеспячэння запуску аднаго выкананага файла ў Windows і Unix-сістэмах ужываецца трук, злучаны з кадаваннем файлаў Windows PE у выглядзе shell-скрыпту, карыстаючыся тым, што Thompson Shell не выкарыстае маркер скрыптоў "#!". Для стварэння праграм, улучальных некалькі файлаў (кампаноўкі ўсіх рэсурсаў у адзін файл), падтрымліваецца фармаванне выкананага файла ў выглядзе адмыслова аформленага ZIP-архіва. Схема прапанаванага фармату (прыклад дадатку hello.com):

MZqFpD=' BIOS BOOT SECTOR' exec 7 $(command -v $0) printf '\177ELF…LINKER-ENCODED-FREEBSD-HEADER' >&7 exec $0 »$@ exec qemu-x86_64 $0 »$@» exit 1 REAL MODE… ELF SEGMENTS… OPENBSD NOTE… MACHO HEADERS… CODE AND DATA… ZIP DIRECTORY…

Спачатку файле паказваецца пазнака "MZqFpD", якая ўспрымаецца як загаловак фармату Windows PE. Дадзеная паслядоўнасць таксама дэкадуецца ў інструкцыі «pop %r10; jno 0x4a; jo 0x4a», а радок «\177ELF» у інструкцыю «jg 0x47», якія прымяняюцца для пракідання на кропку ўваходу. У Unix-сістэмах выконваецца shell-код, у якім выкарыстоўваецца каманда exec з перадачай выкананага кода праз неназваны канал. Абмежаваннем прапанаванага метаду з'яўляецца магчымасць запуску ў Unix-падобных АС толькі з выкарыстаннем абалонак, якія падтрымліваюць рэжым сумяшчальнасці з Thompson Shell.

Выклік qemu-x86_64 прадугледжаны для рэалізацыі дадатковай пераноснасці і дазваляе выканаць скампіляваны для архітэктуры x86_64 код на платформах, выдатных ад x86, напрыклад, на поплатках Raspberry Pi і прыладах Apple, укамплектаваных працэсарамі ARM. Праект таксама можа выкарыстоўвацца для стварэння самадастатковых прыкладанняў, якія працуюць без аперацыйнай сістэмы (bare metal). У такіх прыкладаннях да выкананага файла прымацоўваецца загрузнік, а праграма выступае ў ролі загружанай аперацыйнай сістэмы.

У стандартнай Сі-бібліятэцы libc, якая развіваецца праектам, прапанавана 2024 функцыі (у першым выпуску было каля 1400 функцый). Па прадукцыйнасці Cosmopolitan працуе таксама хутка як і glibc і прыкметна апярэджвае Musl і Newlib, пры тым, што Cosmopolitan па памеры кода на парадак менш glibc і прыкладна адпавядае Musl і Newlib. Для аптымізацыі часта выкліканых функцый такіх як memcpy і strlen, дадаткова выкарыстоўваецца тэхніка «trickle-down performance», пры якой для выкліку функцыі прымяняецца макрас-абвязка, у якім кампілятар інфармуецца аб задзейнічаных у працэсе выканання кода рэгістрах CPU, што дазваляе эканоміць рэсурсы пры захаванні станы CPU за кошт захавання толькі змяняных рэгістраў.

Сярод змен у новым выпуску:

  • Зменена схема звароту да ўнутраных рэсурсаў усярэдзіне zip-файла (пры адкрыцці файлаў зараз выкарыстоўваюцца звычайныя шляхі /zip/… замест звароту па прэфіксе zip:..). Аналагічна для доступу да дыскаў у Windows прадстаўлена магчымасць выкарыстання шляхоў выгляду "/c/…" замест "C:/…".
  • Прапанаваны новы загрузнік APE (Actually Portable Executable), вызначальны фармат універсальных выкананых файлаў. Новы загрузнік выкарыстоўвае mmap для размяшчэння праграмы ў памяці і больш не змяняе змесціва на лета. Пры неабходнасці ўніверсальны выкананы файл можа быць сканвертаваны ў звычайныя выкананыя файлы, прывязаныя да асобных платформаў.
  • На платформе Linux рэалізавана магчымасць выкарыстання модуля ядра binfmt_misc для запуску APE-праграм. Адзначаецца, што выкарыстанне binfmt_misc з'яўляецца найбольш хуткім метадам запуску.
  • Для Linux прапанавана рэалізацыя функцыянальнасці сістэмных выклікаў pledge() і unveil(), якія развіваюцца праектам OpenBSD. Прадастаўляецца API для выкарыстання дадзеных выклікаў у праграмах на мовах C, C++, Python і Redbean, а таксама ўтыліта pledge.com для ізаляцыі адвольных працэсаў.
  • Для зборкі задзейнічана ўтыліта Landlock Make - рэдакцыя GNU Make з больш жорсткай праверкай залежнасцяў і выкарыстаннем сістэмнага выкліку Landlock для ізаляцыі праграмы ад астатняй сістэмы і павышэння эфектыўнасці кэшавання. У якасці опцыі захавана магчымасці зборкі і звычайным GNU Make.
  • Рэалізаваны функцыі для шматструменнасці - _spawn() і _join(), уяўлялыя сабой універсальныя абвязкі над спецыфічнымі для розных аперацыйных сістэм API. Таксама вядзецца праца над рэалізацыяй падтрымкі POSIX Threads.
  • Прадастаўлена магчымасць выкарыстання ключавога слова _Thread_local для выкарыстання асобных для кожнага патоку сховішчаў (TLS, Thread-Local Storage). Па змаўчанні C runtime ініцыялізуе TLS для асноўнага струменя, што прывяло да павелічэння мінімальнага памеру выкананага файл з 12 да 16 КБ.
  • У выкананыя файлы дададзеная падтрымка параметраў "-ftrace" і "-strace" для высновы ў stderr інфармацыі аб усіх выкліках функцый і сістэмных выкліках.
  • Дададзена падтрымка сістэмнага выкліку closefrom(), які падтрымліваецца ў Linux 5.9+, FreeBSD 8+ і OpenBSD.
  • На платформе Linux да 10 разоў павялічана прадукцыйнасць выклікаў clock_gettime і gettimeofday за кошт выкарыстання механізму vDSO (virtual dynamic shared object), які дае магчымасць перанесці апрацоўшчык сістэмнага выкліку ў прастору карыстальніка і пазбегнуць пераключэнняў кантэксту.
  • З бібліятэкі Musl перанесены матэматычныя функцыі для працы з комплекснымі лікамі. Паскорана работа многіх матэматычных функцый.
  • Прапанавана функцыя nointernet(), якая адключае сеткавыя магчымасці.
  • Дададзены новыя функцыі для эфектыўнага прымацавання радкоў: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf і vappendf.
  • Дададзены абаронены варыянт сямейства функцый kprintf(), прызначаны для працы пры падвышаных прывілеях.
  • Значна падвышана прадукцыйнасць рэалізацый SSL, SHA, curve25519 і RSA.

Крыніца: opennet.ru

Дадаць каментар