انتشار پروژه Cosmopolitan 2.0 منتشر شده است که کتابخانه استاندارد C و فرمت فایل اجرایی جهانی را توسعه می دهد که می تواند برای توزیع برنامه ها برای سیستم عامل های مختلف بدون استفاده از مفسر و ماشین های مجازی استفاده شود. نتیجه بهدستآمده از کامپایل در GCC و Clang در یک فایل اجرایی جهانی با پیوند استاتیک کامپایل میشود که میتواند روی هر توزیع لینوکس، macOS، Windows، FreeBSD، OpenBSD، NetBSD اجرا شود و حتی از BIOS فراخوانی شود. کد پروژه تحت مجوز ISC (نسخه ساده شده MIT/BSD) توزیع شده است.
محفظه تولید فایلهای اجرایی جهانی مبتنی بر ترکیب بخشها و هدرهای خاص سیستمعاملهای مختلف (PE، ELF، MACHO، OPENBSD) در یک فایل، ترکیب چندین فرمت مختلف مورد استفاده در یونیکس، ویندوز و macOS است. برای اطمینان از اینکه یک فایل اجرایی منفرد روی سیستمهای ویندوز و یونیکس اجرا میشود، یک ترفند این است که فایلهای 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" "$ @" خروج از 1 REAL MODE… ELF SEGMENTS… OPENBSD NOTE… HEADERS MACHO… CODE AND DATA… ZIP DIRECTORY…
در ابتدای فایل، برچسب "MZqFpD" نشان داده شده است که به عنوان یک هدر فرمت Windows PE درک می شود. این دنباله نیز در دستورالعمل "pop %r10; jno 0x4a ; jo 0x4a"، و خط "\177ELF" به دستورالعمل "jg 0x47"، که برای ارسال به نقطه ورودی استفاده می شود. سیستمهای یونیکس کد پوستهای را اجرا میکنند که از دستور exec استفاده میکند و کد اجرایی را از طریق یک لوله بدون نام عبور میدهد. محدودیت روش پیشنهادی، توانایی اجرا بر روی سیستمعاملهای شبه یونیکس تنها با استفاده از پوستههایی است که از حالت سازگاری تامپسون شل پشتیبانی میکنند.
تماس qemu-x86_64 قابلیت حمل اضافی را فراهم میکند و به کدهای کامپایلشده برای معماری x86_64 اجازه میدهد تا روی پلتفرمهای غیرx86 مانند بردهای Raspberry Pi و دستگاههای اپل مجهز به پردازندههای ARM اجرا شوند. این پروژه همچنین می تواند برای ایجاد برنامه های کاربردی مستقل که بدون سیستم عامل (فلز خالی) اجرا می شوند، استفاده شود. در چنین برنامه هایی، یک بوت لودر به فایل اجرایی متصل می شود و برنامه به عنوان یک سیستم عامل قابل بوت عمل می کند.
کتابخانه استاندارد C libc که توسط این پروژه توسعه یافته است، 2024 عملکرد را ارائه می دهد (در نسخه اول حدود 1400 عملکرد وجود داشت). از نظر عملکرد، Cosmopolitan به سرعت glibc کار می کند و به طور قابل توجهی از Musl و Newlib جلوتر است، علیرغم این واقعیت که Cosmopolitan از نظر اندازه کد یک مرتبه کوچکتر از glibc است و تقریباً مطابق با Musl و Newlib است. برای بهینه سازی توابع متداول فراخوانی شده مانند memcpy و strlen، از تکنیک "ترک پایین عملکرد" نیز استفاده می شود، که در آن از یک ماکرو binding برای فراخوانی تابع استفاده می شود که در آن کامپایلر از رجیسترهای CPU درگیر در اجرای کد مطلع می شود. فرآیند، که امکان ذخیره منابع را هنگام ذخیره وضعیت CPU با ذخیره فقط ثبات های قابل تغییر فراهم می کند.
از جمله تغییرات نسخه جدید:
- طرح دسترسی به منابع داخلی داخل یک فایل فشرده تغییر کرده است (هنگام باز کردن فایل ها، اکنون به جای استفاده از پیشوند zip:.. از مسیرهای معمول /zip/... استفاده می شود). به همین ترتیب، برای دسترسی به دیسک ها در ویندوز، می توان از مسیرهایی مانند “/c/...” به جای “C:/...” استفاده کرد.
- یک لودر جدید APE (در واقع قابل حمل اجرایی) پیشنهاد شده است که فرمت فایل های اجرایی جهانی را تعریف می کند. لودر جدید از mmap برای قرار دادن برنامه در حافظه استفاده می کند و دیگر محتویات را در حال تغییر تغییر نمی دهد. در صورت لزوم، فایل اجرایی جهانی را می توان به فایل های اجرایی معمولی متصل به پلتفرم های جداگانه تبدیل کرد.
- در پلتفرم لینوکس، امکان استفاده از ماژول هسته binfmt_misc برای اجرای برنامه های APE وجود دارد. ذکر شده است که استفاده از binfmt_misc سریعترین روش راه اندازی است.
- برای لینوکس، پیادهسازی عملکرد فراخوانیهای سیستم ()pledge و ()unveil که توسط پروژه OpenBSD ایجاد شدهاند پیشنهاد شدهاست. یک API برای استفاده از این تماسها در برنامههای C، C++، Python و Redbean و همچنین یک ابزار pledge.com برای جداسازی فرآیندهای دلخواه ارائه شده است.
- این سازه از ابزار Landlock Make استفاده میکند - نسخهای از GNU Make با بررسی وابستگی دقیقتر و استفاده از فراخوانی سیستم Landlock برای جداسازی برنامه از بقیه سیستم و بهبود کارایی ذخیرهسازی. به عنوان یک گزینه، توانایی ساخت با GNU Make معمولی حفظ می شود.
- توابع برای multithreading پیاده سازی شده اند - _spawn() و _join()، که پیوندهای جهانی بر روی API های مخصوص سیستم عامل های مختلف هستند. همچنین کار برای اجرای پشتیبانی از POSIX Threads در حال انجام است.
- امکان استفاده از کلمه کلیدی _Thread_local برای استفاده از حافظه جداگانه برای هر رشته (TLS، Thread-Local Storage) وجود دارد. به طور پیش فرض، زمان اجرا C TLS را برای رشته اصلی مقداردهی می کند، که باعث شده حداقل اندازه قابل اجرا از 12 کیلوبایت به 16 کیلوبایت افزایش یابد.
- پشتیبانی از پارامترهای «--ftrace» و «--strace» به فایلهای اجرایی اضافه شده است تا اطلاعات مربوط به همه فراخوانیهای تابع و فراخوانیهای سیستم به stderr را دریافت کند.
- پشتیبانی برای فراخوانی سیستم ()closefrom، که در Linux 5.9+، FreeBSD 8+ و OpenBSD پشتیبانی میشود، اضافه شد.
- در پلتفرم لینوکس، عملکرد تماسهای clock_gettime و gettimeofday تا 10 برابر با استفاده از مکانیزم vDSO (شئ اشتراکگذاری پویا مجازی) افزایش یافته است، که این امکان را فراهم میکند تا کنترلکننده تماس سیستم را به فضای کاربر منتقل کرده و از سوئیچهای زمینه اجتناب شود.
- توابع ریاضی برای کار با اعداد مختلط از کتابخانه Musl منتقل شده اند. کار بسیاری از توابع ریاضی تسریع شده است.
- تابع nointernet() برای غیرفعال کردن قابلیت های شبکه پیشنهاد شده است.
- توابع جدید برای افزودن کارآمد رشته ها اضافه شده است: appendd، appendf، appendr، appends، appendw، appendz، kappendf، kvappendf و vappendf.
- یک نسخه محافظت شده از خانواده توابع kprintf() اضافه شد که برای کار با امتیازات بالا طراحی شده است.
- عملکرد SSL، SHA، curve25519 و RSA به طور قابل توجهی بهبود یافته است.
منبع: opennet.ru