主要观点:
- 链接是将目标文件组合成可执行文件或共享库的过程,如同拼拼图。
- 在 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 稳定的意义。
- 给出了相关的参考资料,包括代码示例、课程、指南等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。