rustc переходит на свою схему манглинга символов: бектрейсы становятся читаемее

20.11.2025

Начиная с ночной сборки от 21 ноября 2025 года компилятор по умолчанию использует собственную схему манглинга символов вместо унаследованной от C++. В бектрейсах и выводе отладчиков теперь видны полные имена функций с параметрами дженериков, а не короткие огрызки.

Откуда взялась старая схема

Исторически Rust перенял у C++ соглашение о кодировании имён Itanium C++ ABI. Схема оказалась неудобной по нескольким причинам: она теряла информацию об инстанцированиях дженерик-параметров, была внутренне непоследовательной, использовала символ точки, поддержка которого есть не на всех платформах, и включала непрозрачный хеш, зависящий от внутренних деталей компилятора.

Из-за этого разные части компилятора всё равно не сходились с ней и пользовались собственным деманглером. Собственная схема, известная как v0, разрабатывается с 2018 года.

Что меняется на практике

Новая схема кодирует информацию однозначно и обратимо, использует только латинские буквы, цифры и подчёркивание, и не зависит от того, как устроен компилятор изнутри.

В бектрейсах теперь видно полное имя: f::foo::<alloc::vec::Vec<(alloc::string::String, &[u8; 123])>> вместо f::foo. Особенно это заметно для асинхронного кода, замыканий и обобщённых функций — то есть ровно там, где старое сокращение делало стек нечитаемым.

Цена вопроса

Символы новой схемы длиннее. Если символы не вырезаются, а по умолчанию они не вырезаются, это означает небольшой рост времени линковки и размера бинарных файлов.

Второе ограничение важнее: старые версии инструментов и дистрибутивов могут не понимать v0 и показывать неразобранные имена. Это касается баг-трекеров, деобфускаторов и сборочных скриптов, которые разбирают имена символов.

Откат — флаги -Csymbol-mangling-version=legacy -Zunstable-options. Включить v0 на стабильной ветке и на бета уже можно через -Csymbol-mangling-version=v0.

Готовые реализации разбора имён лежат в проекте rustc-demangle — на Rust и на C.

Оригинал

Switching to Rust's own mangling scheme on nightly от 20 ноября 2025 года; RFC 2603

Упоминаний: 1 · Просмотров: 2