符号修饰

符号名称修饰rustc 用来为代码生成期间使用的符号编码唯一的名称。编码后的名称被链接器用来将名称与其引用的事物关联起来。

可以使用 -C symbol-mangling-version 选项来控制修饰名称的方法。

逐项控制

可以对项使用 #[no_mangle] 属性 来禁用该项的名称修饰。

可以使用 #[export_name] 属性 来指定函数或静态变量将使用的确切名称。

extern 代码块 中列出的项使用该项的标识符,而不进行修饰来引用该项。可以使用 #[link_name] 属性 来更改该名称。

解码

在某些情况下可能需要解码编码后的名称。例如,调试器和其他工具可能需要反修饰名称,以便用户更容易阅读。最新版本的 gdblldb 内置了对反修饰 Rust 标识符的支持。在需要自己进行反修饰的情况下,可以使用 rustc-demangle crate 以编程方式反修饰名称。rustfilt 是一个可以反修饰名称的 CLI 工具。

运行 rustfilt 的示例

$ rustfilt _RNvCskwGfYPst2Cb_3foo16example_function
foo::example_function

修饰版本

rustc 支持不同的修饰版本,这些版本以不同的方式编码名称。此处不描述旧版本(当前为默认版本)。“v0” 修饰方案解决了旧格式的一些限制,并在 v0 符号格式 章节中描述。