标签 · rlib

1 篇文章,记录每一次探索。

[链接器的世界-原理篇14] C++ 与 Rust:语言特性留下的链接难题
两个 .cpp 包含同一个头文件,各自生成了同一个 inline 函数和模板实例,链接却不报重复定义。本文从这个谜题出发,读懂 Itanium C++ ABI 的名字修饰(_Z、N...E、模板参数、S_ 替换)、extern "C",以及为什么普通函数不编码返回类型;用汇编拆开 COMDAT 组和弱定义这两种 vague linkage 实现,复现 vtable 卷入的 ODR 违规和 undefined reference to vtable;用链接顺序演示静态初始化顺序问题,看 init_priority 与 .init_array.N 的排序、guard 变量与 __cxa_guard_acquire。Rust 部分拆开 rlib,对比 legacy 与 v0 两套修饰,看 no_mangle、used、link_section,用 --print link-args 逐项读 rustc 交给链接器的命令行和依赖顺序,比较 panic=unwind 与 panic=abort 的大小,最后不带标准库和 C 运行时链接一个最小的 Rust 程序。
阅读全文