gcc编译参数-fPIC、-fPIE、-pie

1、-fPIC(Position-Independent Code)

  • 功能-fPIC 选项用于生成位置无关代码(Position-Independent Code)。位置无关代码可以在内存中的任意位置执行,而不需要在加载时进行重定位。
  • 用途:主要用于生成动态库(共享库,.so 文件)的目标文件(.o 文件)。动态库可能被多个程序加载到内存中的不同位置,因此需要位置无关代码来确保在不同内存位置上都能正确执行。
  • 特点
    • 灵活性-fPIC 生成的目标文件可以用于构建动态库,也可以用于构建位置无关的可执行文件(PIE)。
    • 实现机制:通过使用全局偏移表(GOT)和过程链接表(PLT)来访问全局变量和函数,从而实现代码的地址无关性。
gcc -fPIC -c mylib.c -o mylib.o
gcc -shared -o libmylib.so mylib.o

2、-fPIE(Position-Independent Executable)

  • 功能-fPIE 选项用于生成位置无关的可执行文件代码。与 -fPIC 类似,它也生成位置无关代码,但专门针对可执行文件(而不是动态库)。
  • 用途:主要用于生成位置无关的可执行文件(PIE)的目标文件。PIE 允许可执行文件在内存中的任意位置加载,这对于现代操作系统中的地址空间布局随机化(ASLR)非常有用。
  • 特点
    • 优化-fPIE 生成的代码在假设它将被链接为可执行文件的情况下进行了一些优化,可能比 -fPIC 代码更小、更快,因为它减少了对 GOT 和 PLT 的依赖。
    • 限制-fPIE 生成的目标文件不能用于生成动态库。
gcc -fPIE -c main.c -o main.o
gcc -pie -o main main.o

3、-pie(Position-Independent Executable)

  • 功能-pie 选项是链接选项,用于生成位置无关的可执行文件(PIE)。它告诉链接器将使用 -fPIE-fPIC 编译生成的目标文件链接成一个位置无关的可执行文件。
  • 用途:用于构建可以在任意内存地址加载和执行的可执行文件。PIE 是现代操作系统中安全机制(如 ASLR)的一部分,用于防止攻击者预测程序在内存中的布局。
  • 特点
    • 要求:所有用于生成 PIE 的目标文件必须是用 -fPIE-fPIC 编译的。
    • 安全性:生成的 PIE 文件可以显著提高程序的安全性,因为它们可以在每次运行时加载到不同的内存地址。
gcc -fPIE -c main.c -o main.o
gcc -pie -o main main.o

4、-fPIC-fPIE 的选择和覆盖

  • 行为:如果在编译时命令行中同时出现 -fPIC-fPIE,GCC 会只采用最后出现的那个选项,并覆盖之前的选项。例如,如果命令行中有 gcc -fPIC -fPIE ...,GCC 最终会生成 -fPIE 风格的目标文件。
  • 不可同时生效-fPIC-fPIE 不能同时生效,二者中的一个会被覆盖掉,而不会产生任何警告信息。

5、 总结

  • 动态库的编译:使用 -fPIC 来生成位置无关的目标文件,以便构建动态库(.so 文件)。这是标准的做法,保证库可以在不同的进程地址空间中正确加载和运行。
  • 可执行文件的编译
    • 如果不使用 -pie 选项来链接,生成的可执行文件不需要位置无关性,可以选择 -fPIC-fPIE 或者不使用任何这两个选项。
    • 如果使用 -pie 选项来链接,必须使用 -fPIC-fPIE 编译目标文件,这样才能生成位置无关的可执行文件(PIE)。
  • -fPIE 的价值:虽然 -fPIE 可以被 -fPIC 覆盖,但在生成位置无关的可执行文件时,-fPIE 是更优的选择,因为它为此场景进行了特定优化,减少了某些开销,可能提升运行时性能。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值