Phát hành thư viện C tiêu chuẩn Cosmopolitan 2.0, được phát triển cho các tệp thực thi di động

Việc phát hành dự án Cosmopolitan 2.0 đã được xuất bản, phát triển thư viện C tiêu chuẩn và định dạng tệp thực thi phổ quát có thể được sử dụng để phân phối chương trình cho các hệ điều hành khác nhau mà không cần sử dụng trình thông dịch và máy ảo. Kết quả thu được bằng cách biên dịch trong GCC và Clang được biên dịch thành một tệp thực thi phổ quát được liên kết tĩnh có thể chạy trên mọi bản phân phối Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD và thậm chí được gọi từ BIOS. Mã dự án được phân phối theo giấy phép ISC (phiên bản đơn giản của MIT/BSD).

Vùng chứa để tạo các tệp thực thi chung dựa trên việc kết hợp các phân đoạn và tiêu đề dành riêng cho các hệ điều hành khác nhau (PE, ELF, MACHO, OPENBSD) trong một tệp, kết hợp một số định dạng khác nhau được sử dụng trong Unix, Windows và macOS. Để đảm bảo rằng một tệp thực thi duy nhất chạy trên hệ thống Windows và Unix, có một mẹo nhỏ là mã hóa các tệp Windows PE dưới dạng tập lệnh shell, lợi dụng thực tế là Thompson Shell không sử dụng dấu tập lệnh "#!". Để tạo các chương trình bao gồm một số tệp (liên kết tất cả tài nguyên thành một tệp), nó hỗ trợ hình thành tệp thực thi dưới dạng kho lưu trữ ZIP được thiết kế đặc biệt. Sơ đồ định dạng được đề xuất (ví dụ ứng dụng 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 CHẾ ĐỘ THỰC… PHÂN ĐOẠN ELF… LƯU Ý OPENBSD… TIÊU ĐỀ MACHO… MÃ VÀ DỮ LIỆU… THƯ MỤC ZIP…

Ở đầu tệp, nhãn “MZqFpD” được chỉ định, được coi là tiêu đề định dạng Windows PE. Trình tự này cũng được giải mã trong lệnh “pop %r10; jno 0x4a ; jo 0x4a" và dòng "\177ELF" cho lệnh "jg 0x47", được sử dụng để chuyển tiếp đến điểm vào. Các hệ thống Unix chạy mã shell sử dụng lệnh exec, truyền mã thực thi qua một đường ống không tên. Hạn chế của phương pháp được đề xuất là khả năng chạy trên các hệ điều hành giống Unix chỉ sử dụng các shell hỗ trợ chế độ tương thích của Thompson Shell.

Lệnh gọi qemu-x86_64 cung cấp thêm tính di động và cho phép mã được biên dịch cho kiến ​​trúc x86_64 để chạy trên các nền tảng không phải x86, chẳng hạn như bo mạch Raspberry Pi và các thiết bị Apple được trang bị bộ xử lý ARM. Dự án cũng có thể được sử dụng để tạo các ứng dụng độc lập chạy mà không cần hệ điều hành (kim loại trần). Trong các ứng dụng như vậy, bộ tải khởi động được đính kèm vào tệp thực thi và chương trình hoạt động như một hệ điều hành có khả năng khởi động.

Thư viện C tiêu chuẩn libc do dự án phát triển cung cấp 2024 hàm (trong bản phát hành đầu tiên có khoảng 1400 hàm). Về hiệu suất, Cosmopolitan hoạt động nhanh như glibc và vượt trội đáng kể so với Musl và Newlib, mặc dù thực tế rằng Cosmopolitan có kích thước mã nhỏ hơn glibc và gần tương ứng với Musl và Newlib. Để tối ưu hóa các hàm được gọi thường xuyên như memcpy và strlen, kỹ thuật "hiệu suất nhỏ giọt" cũng được sử dụng, trong đó liên kết macro được sử dụng để gọi hàm, trong đó trình biên dịch được thông báo về các thanh ghi CPU liên quan đến việc thực thi mã quá trình, cho phép tiết kiệm tài nguyên khi lưu trạng thái CPU bằng cách chỉ lưu các thanh ghi có thể thay đổi.

Trong số những thay đổi trong bản phát hành mới:

  • Lược đồ truy cập tài nguyên bên trong tệp zip đã được thay đổi (khi mở tệp, các đường dẫn /zip/... thông thường hiện được sử dụng thay vì sử dụng tiền tố zip:..). Tương tự, để truy cập ổ đĩa trong Windows, có thể sử dụng các đường dẫn như “/c/…” thay vì “C:/…”.
  • Một trình tải APE (Thực tế có thể thực thi di động) mới đã được đề xuất, xác định định dạng của các tệp thực thi phổ quát. Trình tải mới sử dụng mmap để đặt chương trình vào bộ nhớ và không còn thay đổi nội dung một cách nhanh chóng nữa. Nếu cần, tệp thực thi chung có thể được chuyển đổi thành các tệp thực thi thông thường được gắn với các nền tảng riêng lẻ.
  • Trên nền tảng Linux, có thể sử dụng mô-đun hạt nhân binfmt_misc để chạy các chương trình APE. Cần lưu ý rằng sử dụng binfmt_misc là phương pháp khởi chạy nhanh nhất.
  • Đối với Linux, việc triển khai chức năng của các lệnh gọi hệ thống cam kết() và tiết lộ() do dự án OpenBSD phát triển đã được đề xuất. API được cung cấp để sử dụng các lệnh gọi này trong các chương trình bằng C, C++, Python và Redbean, cũng như tiện ích commit.com để tách biệt các quy trình tùy ý.
  • Bản dựng sử dụng tiện ích Landlock Make - một phiên bản của GNU Make với tính năng kiểm tra phụ thuộc nghiêm ngặt hơn và sử dụng lệnh gọi hệ thống Landlock để tách chương trình khỏi phần còn lại của hệ thống và cải thiện hiệu quả bộ nhớ đệm. Như một tùy chọn, khả năng xây dựng bằng GNU Make thông thường vẫn được giữ lại.
  • Các chức năng đa luồng đã được triển khai - _spawn() và _join(), là các ràng buộc chung trên các API dành riêng cho các hệ điều hành khác nhau. Công việc cũng đang được tiến hành để triển khai hỗ trợ Chủ đề POSIX.
  • Có thể sử dụng từ khóa _Thread_local để sử dụng bộ nhớ riêng cho từng luồng (TLS, Thread-Local Storage). Theo mặc định, thời gian chạy C khởi tạo TLS cho luồng chính, điều này khiến kích thước thực thi tối thiểu tăng từ 12 lên 16 KB.
  • Hỗ trợ cho các tham số “--ftrace” và “--strace” đã được thêm vào các tệp thực thi để xuất thông tin về tất cả các lệnh gọi hàm và lệnh gọi hệ thống tới stderr.
  • Đã thêm hỗ trợ cho lệnh gọi hệ thống closefrom(), được hỗ trợ trên Linux 5.9+, FreeBSD 8+ và OpenBSD.
  • Trên nền tảng Linux, hiệu suất của các cuộc gọi clock_gettime và gettimeofday đã tăng lên tới 10 lần bằng cách sử dụng cơ chế vDSO (đối tượng chia sẻ động ảo), cho phép di chuyển trình xử lý cuộc gọi hệ thống sang không gian người dùng và tránh chuyển đổi ngữ cảnh.
  • Các hàm toán học để làm việc với số phức đã được chuyển khỏi thư viện Musl. Công việc của nhiều chức năng toán học đã được tăng tốc.
  • Chức năng nointernet() đã được đề xuất để vô hiệu hóa khả năng của mạng.
  • Đã thêm các chức năng mới để nối thêm chuỗi một cách hiệu quả:append,appendf,appr,apps,appendw,appendz,kappendf,kvappendf và vappendf.
  • Đã thêm phiên bản được bảo vệ của nhóm hàm kprintf(), được thiết kế để hoạt động với các đặc quyền nâng cao.
  • Cải thiện đáng kể hiệu suất triển khai SSL, SHA, Curve25519 và RSA.

Nguồn: opennet.ru

Thêm một lời nhận xét