链接器 #
两步链接(Two-pass Linking) R_X86_64_PC32的重定位计算方式 LIBRARY_PATH和LD_LIBRARY_PATH的区别 patch code技术 Section与Segment 链接器定义的特殊符号 符号是链接中的粘合剂 控制链接过程的三种方法 ld默认的链接脚本 链接时不产生符号信息 动态共享对象(DSO,Dynamic Shared Objects)
静态链接 #
静态链接的三个重要Section 静态变量的重定位 符号解析 强符号与弱符号 将强符号定义为弱符号(GCC) 弱引用和强引用 将外部函数声明为弱引用(GCC) COMMON类型的变量 GCC中COMMON块的操作 函数级别链接 静态运行库中一个目标文件只包含一个函数
地址无关 #
地址无关代码(PIC, Position-independent Code) 产生地址无关代码的四种情形 模块内部的数据访问(PIC) 全局偏移表 (Global Offset Table, GOT) GOT的内容是运行时计算出来的 共享模块的全局变量 多进程或多线程访问共享模块中的全局变量
动态链接 #
装载时重定位(Load Time Relocation) 动态链接器的位置 动态链接器与.dynamic段 动态链接器查找共享库的顺序 不同ELF可执行文件的程序入口 -export-dynamic 次版本号交会问题(Minor-revision Rendezvous Problem) FHS规定的共享库的位置 ldconfig LD_PRELOAD LD_DEBUG 如何区分一个DSO是否为PIC PLT(Procedure Linkage Table) PLT在ELF中的实现
运行库 #
glibc程序入口解析 _start和_exit末尾的hlt指令的作用 FILE结构、fd和内核对象