Портативдик аткарылуучу файлдар үчүн иштелип чыккан Cosmopolitan 2.0 стандарттык C китепканасынын чыгарылышы

Котормочуларды жана виртуалдык машиналарды колдонбостон ар кандай операциялык системалар үчүн программаларды жайылтуу үчүн колдонула турган стандарттык C китепканасын жана универсалдуу аткарылуучу файл форматын иштеп чыгуучу Cosmopolitan 2.0 долбоорунун релизи басылып чыкты. 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' 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 ЭСКЕРТҮҮ… MACHO HEADERS… КОД ЖАНА МААЛЫМАТТАР… ZIP DIRECTORY…

Файлдын башында "MZqFpD" энбелгиси көрсөтүлгөн, ал Windows PE форматынын аталышы катары кабыл алынат. Бул ырааттуулук “pop %r10; jno 0x4a ; jo 0x4a" жана "\177ELF" сызыгы "jg 0x47" инструкциясы, алар кирүү чекитине багыттоо үчүн колдонулат. Unix системалары атсыз түтүк аркылуу аткарылуучу кодду өткөрүп, exec буйругун колдонгон кабык кодун иштетет. Сунушталган ыкманын чектөөсү Unix сыяктуу операциялык системаларда Thompson Shell шайкештик режимин колдогон кабыктарды колдонуу менен гана иштөө мүмкүнчүлүгү болуп саналат.

Qemu-x86_64 чалуу кошумча портативдикти камсыз кылат жана x86_64 архитектурасы үчүн түзүлгөн кодду Raspberry Pi такталары жана ARM процессорлору менен жабдылган Apple түзмөктөрү сыяктуу x86 эмес платформаларда иштетүүгө мүмкүндүк берет. Долбоор операциялык тутуму жок (жылаңач металл) иштеген өз алдынча тиркемелерди түзүү үчүн да колдонулушу мүмкүн. Мындай тиркемелерде жүктөгүч аткарылуучу файлга тиркелет жана программа жүктөлүүчү операциялык системанын ролун аткарат.

Долбоор тарабынан иштелип чыккан стандарттык C китепканасы libc 2024 функцияны сунуштайт (биринчи чыгарылышта 1400гө жакын функция болгон). Өндүрүш жагынан Cosmopolitan glibc сыяктуу тез иштейт жана Cosmopolitan glibcге караганда коддун өлчөмү боюнча чоңдуктун тартиби жана болжол менен Мусл менен Ньюлибге туура келгенине карабастан, Мусл менен Ньюлибден байкаларлык алдыда турат. Memcpy жана strlen сыяктуу тез-тез чакырылган функцияларды оптималдаштыруу үчүн кошумча "тамчылоо" ыкмасы колдонулат, мында функцияны чакыруу үчүн макро байланыш колдонулат, мында компилятор коддун аткарылышына катышкан CPU регистрлери жөнүндө маалымат алат. процесси, бул өзгөрүлүүчү регистрлерди гана сактоо менен 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 иштөө убактысы негизги жип үчүн TLSти инициализациялайт, бул минималдуу аткарылуучу өлчөмдү 12ден 16 КБга чейин көбөйтүүгө алып келди.
  • "--ftrace" жана "--strace" параметрлерин колдоо stderrге бардык функциялык чалуулар жана системалык чалуулар жөнүндө маалыматты чыгаруу үчүн аткарылуучу файлдарга кошулду.
  • Linux 5.9+, FreeBSD 8+ жана OpenBSDде колдоого алынган closefrom() тутумдук чалуу үчүн кошумча колдоо.
  • Linux платформасында clock_gettime жана gettimeofday чалууларынын өндүрүмдүүлүгү vDSO (виртуалдык динамикалык жалпы объект) механизмин колдонуу менен 10 эсеге чейин жогорулатылды, бул тутумдук чалууларды иштеткичти колдонуучу мейкиндигине жылдырууга жана контексттик которуштуруулардан качууга мүмкүндүк берет.
  • Комплекстүү сандар менен иштөө үчүн математикалык функциялар Мусл китепканасынан көчүрүлдү. Көптөгөн математикалык функциялардын иши тездетилди.
  • nointernet() функциясы тармак мүмкүнчүлүктөрүн өчүрүү үчүн сунушталган.
  • Саптарды эффективдүү кошуу үчүн жаңы функциялар кошулду: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf жана vappendf.
  • Жогорку артыкчылыктар менен иштөө үчүн иштелип чыккан kprintf() функцияларынын үй-бүлөсүнүн корголгон версиясы кошулду.
  • SSL, SHA, curve25519 жана RSA ишке ашырууларынын бир кыйла жакшыртылган аткаруусу.

Source: opennet.ru

Комментарий кошуу