1. FORTIFY_SOURCE(buffer over-flow 防御)
参考:http://fedoraproject.org/wiki/Security/Features#Compile_Time_Buffer_Checks_.28FORTIFY_SOURCE.29
http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html
此选项用于 gcc 在编译阶段检查是否存在缓冲区溢出问题。相关的原理及说明见上面的两个网址。此处仅举几个简单的例子说明其作用。
示例程序如下:
1 #include <stdio.h>
2 #include <string.h>
3
4 int main()
5 {
6 char str[3];
7
8 strcpy(str, "abcde"); //这里有问题
9
10 return 0;
11 }
首先看看不带 FORTIFY_SOURCE 选项的结果:
[tom@localhost code]$ gcc -O2 -o test test.c
[tom@localhost code]$ ll
可见,不带 FORTIFY_SOURCE 选项的情况下,编译器无法检测到这类问题;
在看看带 FORTIFY_SOURCE 选项的编译结果(注意该选项只能和 -O 选项一起使用,且优化级别大于 0):
[tom@localhost code]$ gcc -O2 -D_FORTIFY_SOURCE=2(1 或者 2) -o test test.cIn file included from /usr/include/string.h:642:0,
from test.c:2:
In function 'strcpy',
inlined from 'main' at test.c:8:8:
/usr/include/bits/string3.h:105:3: warning: call to __builtin___memcpy_chk will always overflow destination buffer [enabled by default]
[tom@localhost code]$
可以看到,已经报出来在源码的第 8 行存在溢出问题。
需要注意的是这个选项只能辅助检测出一部分缓冲区溢出的问题,而不是所有的。
2. gcc的pie和fpie选项
(转自:http://blog.sina.com.cn/s/blog_ae4e800401014pcg.html)Position-Independent-Exe