GCC安全编译选项
1.BIND_NOW
定义:立即绑定,打开GOT表重定位只读选项
使用方式:LDFlAGS="-Wl,-z,relro,-z,now" ./configure
2.NX
堆栈不可执行:打开堆栈不可执行/数据执行保护选项实现堆栈不可执行保护
使用方式:LDFLAGS="-WL,-z,noexecstack" ./configure
3.PIC
定义:地址无关:打开地址随机化,地址无关化代码,地址无关可执行
使用方式:"CFLAGS="-fPIC" ./configure
4.PIE
定义:随机化:打开地址随机化,地址无关代码,地址无关执行
使用方式:"CFLAGS="-fPIE" LDFLAGS="-pie" ./configure
5.SP
定义:栈保护
使用方式:CFLAGS="-fstack-protector-strong" ./configure
6.NO Rpath/Runpath
定义:动态库搜索路径(禁选),禁止使用,-rpath
7.FS
定义:Forrtify Source:用FORTIFY_SOURCE编译宏来打开FS选项
使用方式:CFLAGS="-D_FORTIFY_SOURCE=2 -02" ./configure
8.Ftrapv
定义: 整数溢出检查:打开ftrapv选项来检查整数溢出
使用方式:CFLAGS="-ftrapv" ./congfiure
9.Strip
定义:删除符号表:使用-s选项或者strip工具去除符号表
使用方式:LDFLAGS="-s" ./configure
10.安全编译Python
# 安全连接选项:必须通过LDFLAGSS_NODIST带入
# Makefile中的LDFLAGS 或LDFLAGSS_NODIST,都有使用,重复使用不影响
# 如果仅是通过LDFLAGS带入,则Makefile调用setup.py 编译四个模块时,只读取LDFLAGS_NODIST选项LDFLAGS_NODIST="-Wl,-z,relro,-z,now,-WL,-z,noexecstack -s -fvusibility=hideen -WL ,--build-id=none export LDFLAGS_NODIST"
# LINKFORSHARED是链接python的bin文件,专用的选项,不同的OS取值不同,它需要通过执行 ./configure,读取Makefile中的LINKFORSHARED获得,以某个OS为例,它的值是"-Xlinker -export-dynamic"
# pie安全编译选项,如果通过LDFLAGS或者LDFLAGS_NODIST 带进去都会编译so库时,导致编译so错误,所以,pie只能加到bin/python的专用选项上
export LINKFORSHARED="-XLinker -export-dynamic -pie"
export CFLAGS="-D_FORTIFY_SOURCE=2 -02 -fstack-protector -fPIC,-ftrapv -fstack-check -Wfloat-equal -Wformat=2 -Wshadow -Wpointer-arith -Wcast-qual -Wmissing-prototypes -Wstrict-overflow=1 Wstrict-prototypes -Wl, --build-id=none -l libffi/ include -lopenssl/include -lopenssl/include -lopenssl/include/openssl -lzlib/include"
export CFLAGS
export CPPFLAGS="${CFLAGS}"
export CXXFLAGS="${CFLAGS}"
export LD_LIBRARY_PATH="libffi/lib64:openssl/lib64:zlib/lib:${LD_LIBRARY_PATH}"
./configure --prefix=${PYTHON_HOME} --with-openssl=/openssl && make -j8 && make install