# gcc

gcc在编译代码时可以做出优化,通过选项-On(n=0,1,2...)确定优化等级。优化后的代码在debug时,打印某些变量时会出现<optimized out>。解决方法就是关闭优化选项。或者,如果你只关心某个变量的话,可以将其用volatile关键字修饰。

  • -E 预编译 .c->.i 对应cpp,即c预处理器,主要是在扩展include和宏。
  • -S 编译为汇编代码 .i|.c->.s 对应cc1,即编译器,产生汇编代码。
  • -c 汇编 .s->.o 对应as,即汇编器,产生可重定位目标文件,所有的指令都以二进制表示。
  • -Idir 头文件搜索路径
  • -Ldir 将dir指定为搜索库(-l指定的)的路径
  • -llib 链接时,搜索liblib.a|liblib.so。如果有同名的静态库和动态库,则无-static时取动态库,有则取静态库。
  • -O 开启优化选项。Og, O1, O2等开启了不同的优化选项,从性能考虑,O1,O2优化效果较好,但产生的代码变化会很大,很难理解源码和机器代码的关系,所以,学习时通常使用Og选项,有一定的优化,但源码的整体结构可以很好保存。
  • -fno-stack-protector 关闭栈溢出检测

  • -Wall 启用对某些用户可能会认为有问题(通常容易避免)的结构的警告。
  • -Werror 让所有的warning变成error。
  • -ggdb 产生给gdb用的调试信息。这意味着使用最有表达性的格式。(DWARF,stabs,如果两个都不支持则使用本地格式)

# attribute

  • __attribute__((unused)) 如果变量声明了,但没有被引用过,也不弹出警告
  • __attribute__((used)) 用于static函数或变量,告诉编译器,即使没被引用过也要在obj文件中保留(链接器删除未使用的section时,不会删除有该声明的函数或变量)。

# 工具

# 反汇编器 objdump

  • objdump -d main.o