标签 · x86-64

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

[链接器的世界-原理篇09] TLS:同一个变量,每个线程各有一份
thread_local 变量在每个线程里是同一个名字、不同的地址。这个地址由编译器、链接器和动态加载器合作算出:.tdata/.tbss 与 PT_TLS 是模板,%fs 和 TPIDR_EL0 指向每个线程自己的那一份,四种访问模型在通用和快之间取舍,链接器在知道更多信息时把慢序列原地改写成快序列。本文用 clang、ld.lld 和 GNU ld 的真实输出走一遍全过程,最后解释"cannot allocate memory in static TLS block"的根因。
阅读全文
[链接器的世界-实验篇04] 第一个能运行的 ELF:两张程序头与一个入口
前四个阶段只在读输入。本实验第一次写输出:规划一个最小的可执行映像,手工序列化 ELF 头和两个程序头,让 Linux 内核直接运行它并返回 42。
阅读全文
[链接器的世界-原理篇04] 重定位:一次调用,四个字节的距离
从一个真正能运行的 Linux 程序出发,追踪 call 指令里的四个字节:输入节偏移如何变成 P,CPU 为什么从下一条指令算起,S+A-P 又如何落成机器码。再逐步进入负位移、绝对指针、不同加数、溢出和链接期指令改写。
阅读全文
[链接器的世界-原理篇00] 从一条编译命令出发:程序如何连成整体
从一个正常的跨文件函数调用出发,拆开编译器驱动的预处理、编译、汇编与链接过程,再借类型不一致的程序辨认链接器的信息边界。沿着目标文件、可执行文件与内存映射,建立符号解析、布局、重定位以及编译、链接、加载、运行四个时期的联系,并提供统一的 Linux 本机实验环境。
阅读全文