
【计】 position independent code
【计】 A; AD; ADDR; address; ADR; ADRS
be foreign to; be independent of; have nothing to do with
【计】 don't care
word
【计】 code
【经】 code
地址无关代码(Position-Independent Code, PIC)是计算机科学和软件工程中的一个重要概念,特指一种在内存中无论加载到哪个地址都能正确执行的机器代码或可执行文件格式。其核心设计目标是增强程序的灵活性与安全性,尤其在共享库(Shared Libraries)和地址空间布局随机化(ASLR)等场景中至关重要。
相对寻址替代绝对寻址
PIC通过使用相对偏移量(如相对程序计数器PC)而非绝对内存地址来访问数据或调用函数。例如,函数调用指令不直接写入目标函数的绝对地址,而是计算当前指令位置与目标函数的相对距离。
示例指令:
call 0x1234
(绝对寻址) → call +0x200
(相对寻址)
全局偏移表(GOT)
编译器为每个共享库生成全局偏移表(Global Offset Table, GOT),存储外部变量和函数的实际地址。代码通过GOT的固定偏移间接访问这些符号,加载器在运行时动态填充GOT中的地址值。
过程链接表(PLT)
函数调用通过过程链接表(Procedure Linkage Table, PLT)实现延迟绑定。首次调用函数时,PLT条目跳转到动态链接器解析函数地址并更新GOT;后续调用直接通过GOT跳转。
多个进程可共享同一份PIC库代码的物理内存副本,减少内存占用(如Linux的.so
文件、Windows的DLL)。
支持ASLR技术,随机化代码加载地址以防范缓冲区溢出攻击。
无需重定位即可加载到任意内存地址,适用于嵌入式系统或动态链接环境。
Linux的glibc
、Windows系统DLL均采用PIC编译,确保多进程高效共享代码段。
主程序通过PIC机制调用共享库函数,避免硬编码地址依赖。
ASLR依赖PIC实现随机化基址,有效抵御ROP(Return-Oriented Programming)攻击。
PIC因增加间接寻址(如GOT/PLT访问)可能引入轻微性能开销,但现代处理器通过分支预测和缓存优化已大幅降低其影响。在安全性和灵活性需求优先的场景中,此开销通常可接受。
权威参考资料:
-fPIC
Compilation Option
地址无关代码(Position-Independent Code,PIC)是计算机领域的重要概念,其核心特点与实现原理如下:
地址无关代码指无需修改即可加载到内存任意位置执行的机器码。它通过特殊编译技术,使代码中的地址引用不依赖绝对内存地址,从而解决动态库共享、多进程隔离等问题。该技术广泛应用于共享库(如Linux的.so文件),使同一份库代码可被多个进程复用,避免重复占用内存。
指令与数据分离
将代码中需要修改的地址部分(如全局变量地址)剥离到数据区,保持指令部分固定。每个进程拥有独立的数据副本,而指令部分可共享。
地址引用分类处理
提示:该技术需编译器支持,编译时需添加
-fPIC
等参数。其实现细节涉及ELF文件格式、动态链接过程等底层机制,可通过提及的GOT表机制进一步研究。
程序员定义符号低标号水泥订定者法乐氏综合征反乳化剂费拉脱夫氏征酚磺酞国际标准组织缓冲误差价格浮动甲沟脓炎经济成长率静止位能领域描述字历史法学派硫酸白屈菜硷买入汇率平昆纳因噼啪响强硬前庭小管氢化苯酰胺塞进器散发性霍乱圣墓十二月水磨送葬者天桥