PIE与PIC的区别

在`cc`编译器(通常指GNU Compiler Collection,GCC或其他兼容的C编译器)中,`-fno-PIE`和`-fno-pic`是两个与代码生成和位置无关性相关的编译选项。这两个选项的区别主要体现在它们控制代码的位置无关性(Position Independence)的方式和上下文中。

1. **-fno-PIE (Position Independent Executable)**


* `-fno-PIE`是一个编译选项,用于生成非位置无关的可执行文件(PIE)。在默认情况下,一些系统上的GCC可能会启用PIE选项,这会使生成的可执行文件具有位置无关性。
* 当使用PIE时,可执行文件可以在内存中的任何位置加载和执行,这增加了安全性,因为攻击者更难利用内存中的地址布局。
* `-fno-PIE`明确指定不生成位置无关的可执行文件,这在某些情况下可能是必要的,例如当某些代码或库与PIE不兼容时。
2. **-fno-pic (Position Independent Code)**


* `-fno-pic`是一个编译选项,用于生成非位置无关的代码(PIC)。与PIE不同,PIC通常与共享库(如`.so`文件)相关。
* 当使用`-fPIC`(或`-fpic`,尽管`-fPIC`更常用)编译共享库时,生成的代码是位置无关的,这意味着库可以在内存中的任何位置加载,并且多个进程可以共享同一份库代码。
* `-fno-pic`则指定不生成位置无关的代码。这通常用于静态库或某些特定的可执行文件,当与位置相关的代码更高效或没有与PIC相关的需求时。

**总结**:

* `-fno-PIE`用于控制可执行文件的位置无关性。
* `-fno-pic`用于控制代码(特别是共享库中的代码)的位置无关性。
* 在大多数情况下,使用位置无关的代码和可执行文件可以提高安全性和灵活性,但也可能带来性能上的开销。因此,在选择是否使用这些选项时,需要根据具体的应用场景和需求进行权衡。

posted on 2024-05-29 15:43  zxddesk  阅读(183)  评论(0编辑  收藏  举报

导航