05.12.2021

Cosmopolitan — стандартаная Си-библиотека и формат кроссплатформенных исполняемых файлов


Доступен первый выпуск проекта Cosmopolitan, развивающего стандартную Си-библиотеку и универсальный формат исполняемых файлов, который можно использовать для распространения программ для разных операционных систем. Получаемый при статическом связывании с предложенными libc и runtime файл пригоден для исполнения в любом дистрибутиве Linux, macOS, Windows, FreeBSD и OpenBSD. Код проекта распространяется под лицензией ISC (упрощённый вариант MIT/BSD).

Контейнер для формирования универсальных исполняемых файлов основан на совмещении специфичных для разных Unix-подобных операционных систем сегментов и заголовков (ELF, MACHO, OPENBSD) в одном файле. Для обеспечения запуска одного исполняемого файла в Windows и Unix-системах применяется трюк, суть которого в кодировании файлов Windows PE в виде shell-скрипта, пользуясь тем, что Thompson Shell не использует маркер скриптов «#!». В итоге создаётся исполняемый файл, в котором скомбинировано несколько разных форматов, используемых в Unix, Windows и macOS. Схема предложенного формата (пример приложения 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. Прямой запуск при помощи системного вызова exec не сработает.

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

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

Для создания программ, включающих несколько файлов (компоновки всех ресурсов в один файл), поддерживается формирование универсального исполняемого файла в виде специально оформленного ZIP-архива (содержимое можно посмотреть командой «unzip -v», но файл при этом остаётся доступным для прямого запуска).

Источник: https://www.opennet.ru/opennews/art.shtml?num=54325

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