符号重整
符号名称重整 由 rustc
用于对代码生成过程中使用的符号进行编码,以生成唯一的名称。编码后的名称由链接器用于将名称与它所指代的事物关联起来。
重整名称的方法可以通过 -C symbol-mangling-version
选项控制。
逐项控制
可以使用 #[no_mangle]
属性 在项目上禁用对该项目的名称重整。
可以使用 #[export_name]
属性 指定将用于函数或静态变量的精确名称。
在 extern
块 中列出的项目使用项目的标识符(不进行重整)来引用该项目。可以使用 #[link_name]
属性 更改该名称。
解码
在某些情况下,可能需要对编码后的名称进行解码。例如,调试器和其他工具可能需要对名称进行反重整,以便用户更容易阅读。最近版本的 gdb
和 lldb
内置支持反重整 Rust 标识符。在需要自己进行反重整的情况下,可以使用 rustc-demangle
crate 以编程方式反重整名称。 rustfilt
是一个可以反重整名称的 CLI 工具。
运行 rustfilt 的示例
$ rustfilt _RNvCskwGfYPst2Cb_3foo16example_function
foo::example_function
重整版本
rustc
支持不同的重整版本,这些版本以不同的方式对名称进行编码。遗留版本(当前是默认版本)在此处没有描述。“v0” 重整方案解决了遗留格式的几个限制,并在 v0 符号格式 章节中进行了描述。