解析 Rust 符号

主要观点

  • 链接是将目标文件组合成可执行文件或共享库的过程,如同拼拼图。
  • 在 Rust 等编译语言中,构建包括编译和链接两个阶段,链接器负责解决符号、组合文件等。
  • Rust 编译流程包括词法分析、解析、HIR、MIR、代码生成等阶段,链接器在最后将各部分组合成可执行文件。
  • Rust 默认采用静态链接,将所有依赖一起链接成单个可分发二进制文件。
  • 对象文件包含符号等信息,通过 readelf 或 nm 命令可查看符号表,链接时遵循强符号和弱符号的规则。
  • 可通过创建静态库并手动链接或使用 cargo 来构建项目,cargo 的 build.rs 脚本可用于自定义链接过程。

关键信息

  • Unix-like 系统中的链接器通常是 ld,Rust 中默认链接器是 ld,也可选择 lld 或 mold。
  • Rust 编译各阶段的具体作用,如词法分析将源代码转为令牌流,解析转为抽象语法树等。
  • 符号表的结构和内容,包括全局符号、局部符号等,以及不同命令用于查看符号表。
  • 强符号和弱符号的定义及链接规则,强符号优先,同名强符号会报错。
  • cargo 的 build.rs 脚本可用于自定义链接过程,包括指定链接库的搜索路径和要链接的库。

重要细节

  • 在 Linux VM 中使用 orbstack 创建“机器”,在其中设置 Rust 环境并遇到链接器未找到错误,需安装 build-essential 包含 gcc。
  • Rustc 采用查询式方法进行编译,各阶段并非线性执行,可按需更新。
  • 示例中展示了手动编译和链接 Rust 文件的过程,包括创建对象文件、创建静态库等。
  • 介绍了不同属性如 #[no_main]、#[no_mangle]的作用,以及 unsafe 块在 FFI 中的使用。
  • 提到 Rust 有自己的内部 ABI 但不稳定,以及保证 ABI 稳定的意义。
  • 给出了相关的参考资料,包括代码示例、课程、指南等。
阅读 17
0 条评论