إصدار مكتبة كوزموبوليتان 2.0 القياسية سي المطورة للملفات التنفيذية المحمولة

تم نشر إصدار مشروع Cosmopolitan 2.0، لتطوير مكتبة C القياسية وتنسيق ملف قابل للتنفيذ عالمي يمكن استخدامه لتوزيع البرامج لأنظمة التشغيل المختلفة دون استخدام المترجمين الفوريين والأجهزة الافتراضية. يتم تجميع النتيجة التي تم الحصول عليها من خلال التجميع في دول مجلس التعاون الخليجي و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... ملاحظة OPENBSD... رؤوس MACHO... الكود والبيانات... دليل مضغوط...

في بداية الملف، تتم الإشارة إلى التسمية "MZqFpD"، والتي يُنظر إليها على أنها رأس تنسيق Windows PE. تم فك تشفير هذا التسلسل أيضًا في التعليمات "pop %r10; جنو 0x4a ; jo 0x4a"، والسطر "\177ELF" للتعليمة "jg 0x47"، والتي يتم استخدامها لإعادة التوجيه إلى نقطة الإدخال. تقوم أنظمة يونكس بتشغيل كود الصدفة الذي يستخدم الأمر exec، ويمرر الكود القابل للتنفيذ من خلال أنبوب غير مسمى. يتمثل أحد قيود الطريقة المقترحة في القدرة على التشغيل على أنظمة تشغيل تشبه Unix فقط باستخدام الأصداف التي تدعم وضع التوافق Thompson Shell.

يوفر استدعاء qemu-x86_64 إمكانية نقل إضافية ويسمح بتشغيل التعليمات البرمجية التي تم تجميعها لبنية x86_64 على منصات غير x86، مثل لوحات Raspberry Pi وأجهزة Apple المجهزة بمعالجات ARM. يمكن أيضًا استخدام المشروع لإنشاء تطبيقات قائمة بذاتها تعمل بدون نظام تشغيل (معدن مجرد). في مثل هذه التطبيقات، يتم إرفاق أداة تحميل التشغيل بالملف القابل للتنفيذ، ويعمل البرنامج كنظام تشغيل قابل للتمهيد.

توفر مكتبة C القياسية libc التي طورها المشروع 2024 وظيفة (في الإصدار الأول كان هناك حوالي 1400 وظيفة). من حيث الأداء، يعمل Cosmopolitan بنفس سرعة glibc ويتقدم بشكل ملحوظ على Musl وNewlib، على الرغم من حقيقة أن Cosmopolitan أصغر حجمًا في حجم الكود من glibc ويتوافق تقريبًا مع Musl وNewlib. لتحسين الوظائف التي يتم استدعاؤها بشكل متكرر مثل memcpy وstrlen، يتم استخدام تقنية "الأداء المتتابع" بالإضافة إلى ذلك، حيث يتم استخدام ربط الماكرو لاستدعاء الوظيفة، حيث يتم إبلاغ المترجم عن سجلات وحدة المعالجة المركزية المشاركة في تنفيذ التعليمات البرمجية العملية، والتي تسمح بحفظ الموارد عند حفظ حالة وحدة المعالجة المركزية عن طريق حفظ السجلات القابلة للتغيير فقط.

من بين التغييرات في الإصدار الجديد:

  • تم تغيير نظام الوصول إلى الموارد الداخلية داخل ملف مضغوط (عند فتح الملفات، يتم الآن استخدام المسارات المعتادة /zip/... بدلاً من استخدام الرمز البريدي:.. البادئة). وبالمثل، للوصول إلى الأقراص في نظام Windows، من الممكن استخدام مسارات مثل "/c/..." بدلاً من "C:/...".
  • تم اقتراح مُحمل جديد APE (قابل للتنفيذ محمول بالفعل)، والذي يحدد تنسيق الملفات القابلة للتنفيذ العالمية. يستخدم المُحمل الجديد mmap لوضع البرنامج في الذاكرة ولم يعد يغير المحتويات بسرعة. إذا لزم الأمر، يمكن تحويل الملف القابل للتنفيذ العالمي إلى ملفات عادية قابلة للتنفيذ مرتبطة بمنصات فردية.
  • على منصة Linux، من الممكن استخدام وحدة binfmt_misc kernel لتشغيل برامج APE. تجدر الإشارة إلى أن استخدام binfmt_misc هو أسرع طريقة إطلاق.
  • بالنسبة لنظام التشغيل Linux، تم اقتراح تنفيذ وظيفة استدعاءات نظام التعهد () وكشف () التي تم تطويرها بواسطة مشروع OpenBSD. يتم توفير واجهة برمجة التطبيقات (API) لاستخدام هذه الاستدعاءات في برامج C وC++ وPython وRedbean، بالإضافة إلى أداة مساعدة تعهد.com لعزل العمليات العشوائية.
  • يستخدم البناء الأداة المساعدة Landlock Make - وهي نسخة من GNU Make مع فحص أكثر صرامة للتبعية واستخدام استدعاء نظام Landlock لعزل البرنامج عن بقية النظام وتحسين كفاءة التخزين المؤقت. كخيار، يتم الاحتفاظ بالقدرة على البناء باستخدام GNU Make العادي.
  • تم تنفيذ وظائف تعدد العمليات - _spawn() و _join()، وهي روابط عالمية عبر واجهات برمجة التطبيقات الخاصة بأنظمة التشغيل المختلفة. يجري العمل أيضًا على تنفيذ دعم POSIX Threads.
  • من الممكن استخدام الكلمة الأساسية _Thread_local لاستخدام مساحة تخزين منفصلة لكل مؤشر ترابط (TLS، تخزين مؤشر الترابط المحلي). افتراضيًا، يقوم وقت تشغيل C بتهيئة TLS للسلسلة الرئيسية، مما أدى إلى زيادة الحد الأدنى للحجم القابل للتنفيذ من 12 كيلو بايت إلى 16 كيلو بايت.
  • تمت إضافة دعم المعلمات "--ftrace" و"--strace" إلى الملفات القابلة للتنفيذ لإخراج معلومات حول جميع استدعاءات الوظائف واستدعاءات النظام إلى stderr.
  • تمت إضافة دعم لاستدعاء النظام Closefrom()، المدعوم على Linux 5.9+ وFreeBSD 8+ وOpenBSD.
  • على نظام التشغيل Linux، تمت زيادة أداء مكالمات Clock_gettime وgettimeofday بما يصل إلى 10 مرات باستخدام آلية vDSO (الكائن الديناميكي الافتراضي المشترك)، مما يجعل من الممكن نقل معالج استدعاء النظام إلى مساحة المستخدم وتجنب تبديل السياق.
  • تم نقل الدوال الرياضية للتعامل مع الأعداد المركبة من مكتبة الموصل. تم تسريع عمل العديد من الوظائف الرياضية.
  • تم اقتراح وظيفة nointernet() لتعطيل قدرات الشبكة.
  • تمت إضافة وظائف جديدة لإلحاق السلاسل بكفاءة: appendd وappendf وappendr وappends وappendw وappendz وkappendf وkvappendf وvappendf.
  • تمت إضافة نسخة محمية من عائلة وظائف kprintf()، المصممة للعمل بامتيازات مرتفعة.
  • تحسين أداء تطبيقات SSL وSHA وcurve25519 وRSA بشكل ملحوظ.

المصدر: opennet.ru

إضافة تعليق