符号修饰
符号名称修饰 被 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 符号格式 章节中描述。