地址无关代码(PIC)是不依赖固定加载地址、能在内存任意位置执行的二进制形式,核心用于共享库以支持多进程共用物理代码页;通过PLT/GOT机制实现相对寻址与间接跳转,需编译时加-fPIC并链接时用-shared。

地址无关代码(PIC,Position-Independent Code)是指编译后不依赖固定加载地址、能在内存任意位置正确执行的机器码。在 C++ 中,它不是语言特性,而是编译器和链接器协同生成的一种二进制形式,核心目标是支持共享库(如 Linux 的 .so 文件)被多个进程以不同基地址映射到各自虚拟内存中,同时共用同一份物理代码页。
普通可执行文件有固定入口和地址布局,而共享库可能被加载到任意地址(ASLR 安全机制也会随机化)。如果库中直接写死全局变量或函数的绝对地址(比如 call 0x4005a0),一旦加载位置偏移,调用就会跳错。PIC 通过相对寻址 + 间接跳转绕过这个问题:
不是默认行为,需显式启用:
加载器(如 Linux 的 ld-linux.so)把 .so 映射到某个虚拟地址后,并不修改代码段(只读),而是填充数据段里的 GOT:
立即学习“C++免费学习笔记(深入)”;
PIC 不是零开销,也不是万能的:
基本上就这些。理解 PIC 关键在于分清“代码如何跳”和“数据如何取”,背后是 ELF 格式、加载器协作与硬件寻址模式共同作用的结果。不复杂但容易忽略细节。
以上就是c++++中的地址无关代码(PIC)是什么_c++动态链接库底层原理【链接】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号