基础指令

最基本的GCC编译命令格式:

1
gcc [选项] [源文件] [选项] [目标文件]
  • -o:将C源文件编译成可执行文件
  • -g:生成时候带有debug信息

常用命令

1
2
3
4
5
6
7
8
9
#32 位保护全关的编译命令
gcc -m32 -fno-stack-protector -z execstack -no-pie -fno-pic -O0 -U_FORTIFY_SOURCE -o program32 program.c
#64 位保护全关的编译命令
gcc -m64 -fno-stack-protector -z execstack -no-pie -fno-pic -O0 -U_FORTIFY_SOURCE -o program64 program.c

#32 位保护全关且关闭编译器警告命令
gcc -m32 -fno-stack-protector -z execstack -no-pie -fno-pic -Wno-implicit-function-declaration -o program32 program.c
#32 位保护全关且关闭编译器警告命令
gcc -m64 -fno-stack-protector -z execstack -no-pie -fno-pic -Wno-implicit-function-declaration -o program64 program.c

平台相关

  • -m32:生成 32 位代码,需要系统安装 32 位开发库。
  • -m64:生成 64 位代码(默认选项,64 位系统下)。

保护机制相关

  • NX 保护(数据执行保护)
    • -z execstack:关闭 NX 保护,使栈可执行(不安全)。
    • -z noexecstack:开启 NX 保护(默认),使栈不可执行。
  • Canary(栈保护)
    • -fno-stack-protector:关闭栈保护。
    • -fstack-protector:启用基础栈保护。
    • -fstack-protector-all:启用全面栈保护(所有函数)。
  • RELRO(地址重定向保护)
    • -Wl,-z,relro:部分 RELRO,使 GOT 表只读。
    • -Wl,-z,now:完全 RELRO,程序加载时解析所有符号。
  • PIE(位置无关可执行文件)
    • -fPIE -pie:生成 PIE 可执行文件,启用 ASLR 保护。
    • -no-pie
  • Fortify Source
    • -D_FORTIFY_SOURCE=2:增强缓冲区溢出检测。

优化相关

  • -O0:不进行优化(默认级别),调试友好。
  • -O1:基础优化,在编译时间和代码性能间平衡。
  • -O2:中级优化,比 - O1 更激进,推荐生产环境使用。
  • -O3:高级优化,启用更多优化选项,可能增加编译时间。
  • -Os:针对代码尺寸优化,适合嵌入式系统。