تیم Rolldown به‌تازگی اصلاحیه‌ای را ادغام کرده است که از کرش کردن Vite با خطای “Illegal instruction” در دستگاه‌های Android ARM64 که در محیط Termux اجرا می‌شوند، جلوگیری می‌کند. پس از ده ماه که توسعه‌دهندگان شاهد از کار افتادن بیلد‌های خود پیش از اجرای هر کدی بودند، این مشکل بالاخره برطرف شد و نسخه بعدی Rolldown در npm به‌صورت آماده و بدون نیاز به تنظیمات اضافی کار خواهد کرد.

چرا این کرش اهمیت داشت

Termux به کاربران اجازه می‌دهد یک محیط مشابه Linux را روی گوشی‌های Android اجرا کنند و جامعه رو به رشدی به آن به‌عنوان تنها ایستگاه کاری توسعه خود متکی است. در بنگلادش، نیجریه و اندونزی، بسیاری از برنامه‌نویسان به‌جای لپ‌تاپ، از گوشی برای نوشتن و باندل کردن اپلیکیشن‌های وب استفاده می‌کنند. Vite، ابزار ساخت سریعی که قدرت بخشیدن به سایت‌های مدرن بی‌شماری است، بخش اصلی این گردش کار محسوب می‌شود. وقتی Vite سعی می‌کرد اجرا شود، بلافاصله با خطای “Illegal instruction” مواجه می‌شد و فرآیند را حتی پیش از تجزیه (parse) کردن هیچ کد JavaScript از کار می‌انداخت. این خطا هیچ stack trace یا لاگی ارائه نمی‌داد، زیرا هنگام بارگذاری یک کتابخانه native رخ می‌داد؛ این موضوع توسعه‌دهندگان را در بن‌بستی بدون راه حل مشخص رها می‌کرد.

عدم تطابق فنی

علت اصلی در یک فرض سطح پایین (low-level) نهفته بود که در binding native مربوط به Rolldown گنجانده شده بود. کد انتظار داشت که پردازنده از دستورالعمل‌های ARMv8.1 پشتیبانی کند؛ مجموعه‌ای از دستورالعمل‌ها که در تراشه‌های جدیدتر وجود دارد اما در بسیاری از SoCهای پرکاربرد Android، مانند Cortex-A53، دیده نمی‌شود. وقتی دستگاهی فاقد آن دستورالعمل‌ها سعی می‌کرد کتابخانه را بارگذاری کند، CPU یک استثنای (exception) illegal-instruction صادر می‌کرد.

موضوع پیچیده‌تر از این می‌شود که کد مشکل‌ساز در یک وابستگی (dependency) به نام mimalloc قرار داشت؛ یک تخصیص‌دهنده حافظه (memory allocator) که شامل یک پرچم (flag) امنیتی برای جلوگیری از استفاده از دستورالعمل‌های پشتیبانی‌نشده است. آن پرچم تنها در محیط‌های “standard Linux” فعال می‌شد. Android با وجود استفاده از هسته (kernel) Linux، خود را متفاوت معرفی می‌کند، بنابراین آن محافظ هرگز فعال نمی‌شد و کرش از میان آن عبور می‌کرد.

نحوه ساخت اصلاحیه

تغییر ادغام‌شده، بررسی امنیتی mimalloc را گسترش می‌دهد تا Android (و FreeBSD) را نیز به‌عنوان پلتفرم‌هایی که به همان محافظت نیاز دارند، شناسایی کند. با وصله کردن (patching) کتابخانه به‌جای مجبور کردن توسعه‌دهندگان به بازسازی یا جایگزینی پکیج‌ها، این اصلاحیه سازگاری را بدون نیاز به هیچ مرحله اضافی برای کاربران نهایی بازمی‌گرداند.

آنچه توسعه‌دهندگان به دست می‌آورند

  • نیازی به پکیج سفارشی Termux نیست. دستور استاندارد npm install برای Rolldown اکنون باینری‌ای را دریافت می‌کند که به بررسی امنیتی جدید احترام می‌گذارد.
  • امکان تست فوری. یک نسخه پیش‌نمایش (preview build) که به pull request باز پیوست شده است، به هر کسی که دستگاه Android با معماری ARM64 دارد اجازه می‌دهد همین امروز اصلاحیه را تأیید کند، تا زمانی که نسخه رسمی بعدی Rolldown در npm منتشر شود.

ملاحظات باقی‌مانده

حل نهایی به انتشار پکیج به‌روزرسانی‌شده توسط نگهدارندگان Rolldown بستگی دارد؛ تا زمانی که این اتفاق بیفتد، کاربران باید به نسخه پیش‌نمایش تکیه کنند.

آنچه باید در ادامه دنبال کرد

  • زمان انتشار در npm. تغییرات (changelog) Rolldown را زیر نظر داشته باشید؛ به محض اینکه نسخه جدید در ریجستری منتشر شود، یک دستور ساده npm install rolldown این اصلاحیه را به محیط عملیاتی (production) می‌آورد.

این وصله ادغام‌شده، یک بن‌بست چندماهه را به یک به‌روزرسانی روتین تبدیل می‌کند و نشان می‌دهد که چگونه داده‌های استفاده واقعی و گزارش‌های مداوم جامعه می‌تواند یک باگ «برنامه‌ریزی‌نشده» را به یک مشکل حل‌شده تبدیل کند. برای هر کسی که اپلیکیشن‌های وب را روی گوشی می‌سازد، نسخه بعدی Rolldown بالاخره اجازه می‌دهد Vite بدون از کار انداختن پردازنده اجرا شود.