标签 · COMDAT

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

[链接器的世界-实验篇09] 不知道加载地址时怎么链接:自重定位的静态 PIE
在 class8 前端与 class6 布局之上生成静态 PIE,区分静态补丁和加载期指针,并通过提供的启动代码完成自重定位。
阅读全文
[链接器的世界-原理篇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 程序。
阅读全文
[链接器的世界-原理篇03] 符号解析:同一个名字,究竟指向谁
从一个能独立运行的加法程序开始,亲手制造缺失定义、重复定义和库顺序错误。沿着“谁需要、谁提供、提供者是否进入链接”理解符号解析,再讨论弱定义、common、类型检查与 C++ 的边界。
阅读全文