mold 3.0 Rust-д бүрэн шилжив: C++ хувилбарын үе дууслаа

|Зохиогч: QUASA редакцын баг|4 мин уншина
mold 3.0 Rust-д бүрэн шилжив: C++ хувилбарын үе дууслаа

mold 3.0 цувралын 3.0.0 хувилбар 2026 оны 10 дугаар сарын 5-нд гарч, C++-ээс Rust руу дахин бичигдсэн анхны гаргалт болсныг албан ёсны тэмдэглэл д мэдээлжээ. Уг тэмдэглэлд 2.42.1-ийг C++-ийн сүүлийн хувилбар гэж тодорхойлж, шинэ хувилбарыг түүний “drop-in replacement” буюу шууд орлуулалт байхаар зорьсноо бичсэн. Linux төслийн linker-ийг бэлэн багцаар шинэчлэх болон mold-ийг эх кодоос нь угсрах нь иймээс өөр өөр бэлтгэл шаардана.

10 дугаар сарын 5-ны Phoronix-ийн мэдээ Rust хувилбар гарсныг мэдээлж, эх кодоос угсрахад CMake-ийг Cargo орлож, Rust 1.95 буюу түүнээс шинэ хувилбар шаардлагатайг онцолсон. C хөрвүүлэгч мөн хэрэгтэй. Харин mold-ийг зөвхөн linker болгон дууддаг build-ийн хувьд командын сонголт, дэмжих архитектур, гаралтыг өмнөх хувилбартай нийцүүлэх нь гаргалтын зорилго юм.

Шууд орлуулалт linker-ийн хэрэглээнд хамаарна

mold 3.0 нь өмнөх хувилбарын командын мөрийн сонголтуудыг хүлээн авч, ижил зорилтот архитектуруудыг дэмжинэ. Алдаа засвар орсон тохиолдлоос бусад үед ижил гаралт үүсгэхээр төлөвлөсөн бөгөөд холболтын гүйцэтгэл 2.42.1-ийн түвшинд хэвээр гэж гаргалтын мэдээлэлд дурдсан. Энэ нь compiler эсвэл build системээс mold руу дамжуулдаг ердийн сонголтуудыг Rust шилжилтээс болж бөөнөөр нь солих шаардлагагүй гэсэн утгатай.

Нийцлийг шалгахдаа дэмждэг зорилт бүр дээр тест ажиллуулж, бодит төслүүдийн оролт болон командын сонголтын олон хослолоор гаралтыг харьцуулсан. Gentoo-ийн бүх багцыг угсрах шалгалтад ухралт илрээгүй гэж гаргалтын мэдээлэлд тэмдэглэсэн. Ийм өргөн шалгалт нь шинэ linker-ийг нэвтрүүлэх үндэслэл боловч тухайн төслийн linker script, экспортлох тэмдэг, binary-ийн бүтцийг хатуу шалгадаг ажлын урсгалд гарч болох ялгааг үгүйсгэхгүй.

Бэлэн багц суулгадаг CI орчинд mold-ийн өөрийн build жор өөрчлөгдөхгүй. Харин шинэчлэлтийн дараа compiler үнэхээр шинэ mold-ийг дуудаж байгаа эсэх, үйлдвэрлэлд хэрэглэдэг linker сонголтууд ажиллаж байгаа эсэх, үүссэн executable болон shared library өмнөх шалгалтуудаа давж байгаа эсэх нь чухал. Эдгээр нь багц солигдсон эсэх болон гаралтын зан төлөв өөрчлөгдсөн эсэхийг тусад нь харуулна.

Алдаа засварууд гаралтад бодит ялгаа үүсгэж болно

Ижил гаралт гэсэн зорилтод алдаа засваруудын онцгой нөхцөл бий. --gc-sections нь --init, --fini сонголтоор заасан функцуудыг устгахаа больсон; --icf=safe нь shared library-гаас экспортолсон функцуудыг нэгтгэхээ больсон. Ийм сонголт хэрэглэдэг build-д шинэ binary өмнөхөөс ялгаатай гарвал эхлээд эдгээр засварын нөлөөг ялгаж үзэх хэрэгтэй.

Нэг зураасаар эхэлдэг сонголтыг GNU ld-ийн адил унших засвар мөн орсон. Өмнө нь -entry=main-ийг буруу задлан тайлбарлаж байсан бол одоо сонголтын утгыг зөв хүлээн авна. Хувилбарын скриптэд нэг тэмдэг хэд хэдэн бүлэгт давхар орсон үед эхний бүлгийг баримтлах болсон нь экспортын жагсаалт эсвэл ABI шалгадаг төслүүдэд мэдрэгдэж болно.

Зарим буруу оролт одоо гэмтэлтэй гаралт үүсгэхийн оронд алдаа өгнө. Жишээ нь --strip-all болон --emit-relocs-ийг хамтад нь хэрэглэсэн тохиолдол, эсвэл shared library дахь тэмдэг рүү --defsym-ээр заасан тохиолдол үүнд орно. Мөн эвдэрсэн object файл дээр C++ хэрэгжүүлэлт санах ойн хязгаараас давж уншин segmentation fault өгөх боломжтой байсан бол Rust хэрэгжүүлэлт тэр хандалтыг шалгаж, алдаа гарсан цэгт panic үүсгэнэ.

Эх кодоос угсрахад CI жор солигдоно

mold-ийг өөрийн CI image эсвэл түгээлтийн багц дотор угсардаг багийн хувьд өөрчлөлт linker-ийн командын мөрөөс өмнө эхэлнэ. CMake-ийн тохиргоонууд хасагдсан; шинэ build команд нь cargo build --release, суулгах алхам нь ./install-mold.sh болсон. Суулгах скрипт PREFIX болон DESTDIR орчны хувьсагчийг хүлээн авдаг тул багцын шаталсан суулгалтын замыг тэдгээрээр тохируулна.

CI image-д Rust 1.95 буюу түүнээс шинэ toolchain болон C хөрвүүлэгч байх ёстой. Cargo ашиглах болсон тул хамаарлуудыг татах эсвэл байгууллагын mirror, урьдчилан бэлтгэсэн сангаас авах нөхцөлийг мөн build орчиндоо шийдэх шаардлагатай. Хуучин CMake командуудыг үлдээсэн pipeline linker-ийн нийцлийг шалгах шатандаа хүрэхээс өмнө угсралт дээр зогсоно.

Сангуудыг $PREFIX/lib-ээс өөр газар, тухайлбал /usr/lib64-д суулгадаг бол MOLD_LIBDIR-ийг угсрах болон суулгах үед ижил утгаар өгөх ёстой. Ингэснээр mold -run нь mold-wrapper.so-г олох замаа мэднэ. Ердийн linker дуудлага амжилттай өнгөрсөн мөртөө wrapper ашигладаг ажил алдаа өгөх боломжтой тул багцын суулгалтын замыг дан ганц executable файлаар нь дүгнэхэд хангалтгүй.

Өмнөх MOLD_TARGETS CMake хувьсагчийг Cargo feature орлосон бөгөөд түгээлтийн багц бүх зорилтыг хамруулан угсрах шаардлага хэвээр. Тест ctest-ээс cargo test рүү, тестийн хамаарал бэлтгэх скрипт install-test-deps.sh рүү шилжсэн. oneTBB хамаарал арилсан; системийн malloc хэрэглэх бол --features system-allocator сонголт бий. Ийм тохиргоотой баг шинэ жорондоо хуучин тохиргооны зорилгыг тус бүрээр нь шилжүүлэх хэрэгтэй.

Буцах зам нь багц ба build орчноос хамаарна

Өмнөх 2.42.1 хувилбарын тэмдэглэл д Rust руу шилжих төлөвлөгөөг урьдчилан танилцуулж, шаардлагатай бол C++ хувилбарт нэмэлт засварын гаргалт хийж болохыг дурдсан байв. Одоо гарсан 3.0.0-ийн тэмдэглэл 2.42.1-ийг C++-ийн сүүлийн гаргалт гэж нэрлэсэн. Тиймээс буцах төлөвлөгөөг таамагласан дараагийн C++ хувилбарт бус, ашиглаж байсан тодорхой багц эсвэл tag-д тулгуурлуулах нь зөв.

Бэлэн багц хэрэглэдэг pipeline-д буцахад өмнөх багцын хувилбар болон түүнийг суулгадаг repository эсвэл хадгалсан artifact хэрэгтэй. Эх кодоос угсардаг pipeline-д түүн дээр CMake жор, хуучин CI image, суулгалтын замын тохиргоо нэмэгдэнэ. Зөвхөн mold executable файлыг буцаах нь дараагийн эх кодын угсралтыг хуучин аргаар ажиллуулахгүй.

Шинэчлэлтийн шийдвэрийг дарааллуулбал эхлээд mold өөрөө шинэ орчинд угсарч суух, дараа нь бодит төслийн холбоосын ажил болон гаралтын шалгалт давах ёстой. Эхний шатны алдаа Cargo, toolchain эсвэл суулгалтын замтай холбоотой; дараагийн шатанд илэрсэн ялгаа linker-ийн засвар, сонголт, скриптийн тайлбартай холбоотой байж болно. Энэ зааг тодорхой байвал асуудал гарсан үед тохирох багц, build жор, CI image-ийг хамтад нь буцаах боломжтой.

Мөн уншаарай:

Хуваалцах:

Мэдээллийн товхимолд бүртгүүлэх

Web3, AI болон криптоны шинэ мэдээг шууд имэйл хайрцагтаа аваарай.

0