标签 · 符号版本
2 篇文章,记录每一次探索。
[链接器的世界-原理篇13] ABI 演进:库升级了,旧程序怎么办
2026-10-04
结构体加了一个字段,没有重新编译的旧程序照样能加载,算出来的数却错了。动态链接只按名字和版本配对,不看类型和布局。本文从这个故障出发,讲 ABI 和 API 的区别、哪些改动会破坏 ABI;libtool 的 current:revision:age 怎样变成 soname 和文件名,Debian 的包名为什么带 soname;符号版本在实践中怎么用:版本节点继承、同一个函数的新旧两个实现、glibc 的 memcpy 和 fmemopen、在新系统上编译的程序为什么到旧系统上报 GLIBC_2.34 not found 以及怎样用旧 sysroot 解决;最后用 abidiff 和 abi-compliance-checker 在发布前查出被改坏的 ABI。实验统一在 x86-64 Linux 原生执行,以 glibc 2.43 和隔离解包的 glibc 2.17 对照。
阅读全文
[链接器的世界-原理篇07] 动态链接:把最后的地址留给运行时
2026-10-04
共享库的加载地址要到运行时才知道,它引用的符号甚至可能被别的库替换。链接器在链接时能做的,是把所有"现在还填不了"的地址集中到少数几处,再给动态链接器 ld.so 写一份说明书。本文从 PIC、GOT、PLT 讲到几类动态重定位、惰性绑定、RELRO、符号插入、符号版本和 ld.so 的启动顺序,全部配真实的目标文件与链接输出。
阅读全文