GCC常用选项

命令常用

Gcc 命令本身就有很多可以使用文档, 如果对编译和链接过程需要有详细控制的,可以细看 gcc 文档


gcc -dumpmachine # 打印当前机器信息, 示例: 
# output: x86_64-linux-gnu

gcc -print-search-dirs # 打印搜索路径


gcc --help=target # 可以查看可以详细控制的选项

# 查看当前C++编译器 ABI 兼容问题, 参考: 
# https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
echo '#include <string> ' | g++ -dM -E -x c++ - | grep _GLIBCXX_USE_CXX11_ABI

# 查看当前C++编译器是否支持symbol version
# https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA.junk/symversion.html
echo '#include <string> ' | g++ -dM -E -x c++ - | grep  _GLIBCXX_SYMVER  

编译常见

安全相关的编译选项

在编译器层面,gcc提供了不少安全方面的编译选项,主要有:

# NX(DEP)
-z execstack  # 禁用NX保护
-z noexecstack # 开启NX保护| 堆栈禁止执行 
# RELRO
-z norelro # 关闭
-z lazy # 部分开启
-z now # 全部开启| GOT写保护 

# CANARY
-fno -stack-protector # 禁用
-fstack-protector # 开启
-fstack-protector-all # 完全开启| 堆栈溢出哨兵 

# FORTIFY
-D_FORTIFY_SOURCE =1 # 较弱的检查
-D_FORTIFY_SOURCE=2 # 较强的检查| 常用函数加强检查 

# PIE(ASLR)
-fpie -pie # 开启PIE,此时强度为1
-fPIE -pie # 开启PIE,此时为最高强度2| 代码段、数据段地址随机化 

Ref