PIC和PIE

本文深入解析了ELF(可执行和可链接的格式)、PIC(位置无关代码)、PIE(位置无关可执行程序)、GOT(全局偏移量表)和PLT(过程链接表)的概念与作用。探讨了它们如何在类Unix系统中协同工作,特别是在共享库和动态链接过程中的关键角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1概念

  • ELF。Exucutable and Linkable Format,译为“可执行和可链接的格式”。
    它是关于可执行文件、对象代码、共享库和内核导出的一种公共标准文件的格式定义,广泛应用于类unix系统。每个ELF文件由三个部分组成:Program header table、Sectoin header table、Data referred to above。
    Elf-layout--en.svg

  • PIC。Position-Independent Code,译为“位置无关代码”。
    在计算机系统中,PIC是可以在主存中不同位置执行的目标代码。PIC经常被用在共享库中,这样就能将相同的库代码为每个程序映射到一个位置,不用担心覆盖掉其他程序或共享库。

  • PIE。Position-Independent Executable,译为“位置无关可执行程序”。
    它是完全由位置无关代码所组成的可执行二进制文件,有时可称为PIC Executable。它有一个显著的优点,那就是当程序加载时,所有PIE二进制文件以及它所有的依赖都会加载到虚拟内存空间中的随机位置(随机地址),可以有效提高他人通过绝对地址实施"return-to-libc"安全攻击的难度。

  • GOT。Global Offset Table。全局偏移量表。
    它是数据字段的地址存储表。它被可执行程序用于查看全局变量的运行时地址,这些变量的地址在编译阶段是未知的。在进程引导阶段,动态链接器会更新GOT。

  • PLT。Procedure Linkage Table。过程链接表
    它将位置无关的的函数调用转换为绝对地址。形象的比喻,PLT像蹦床一样,将对共享函数的调用弹向正确的方向。

  • Lasy Loading/Lasy Binding。延迟加载。
    在位置无关代码PIC中一般不能包含动态链接库中符号的绝对地址。当运行某个调用动态库函数符号的用户态程序时,用户态程序在编译链接阶段并不知晓该符号的具体位置,只有等到运行阶段,动态加载器将所需要的共享库加载到内存后,才最终确定符号的地址。而在编译阶段所有与位置无关的函数调用都将被保存到ELF文件的过程链接表PLT(Procedure Linkage Table)中。

2 引用

转载于:https://www.cnblogs.com/sword03/p/9385660.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值