命令常用
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| 代码段、数据段地址随机化