预处理(preprocessing):
头文件、宏定义(#include, #ifdef, #define)
gcc -E test.c -o test.i
编译(compilation):
汇编语言
gcc -S test.i -o test.s
汇编(assembly):
机器语言
gcc -C test.s -o test.o
链接(linking):
链接依赖库
静态链接:将依赖的库都添加进可执行文件
动态链接:只添加描述性的信息,程序执行时再加载相应的动态库
编译静态库:
ar -r test.o -o libtest.a
编译动态库:
gcc -share -fPIC test.o -o libtest.so
静态链接:
gcc main.c -static -L./ -ltest -o exe
动态链接:
gcc main.c -L./ -ltest -o exe
ELF(executable linkable format):
readelf -S exe
.test:代码段
.data:数据段,包括已初始化的全局变量、局部静态变量
.bss:未初始化的全局变量、局部静态变量,可能还有已初始化为默认值的全局变量和局部静态静态变量。该段不占用flash大小
.rodata:只读数据段,如字符串常量、const变量
.comment:注释信息段
.note.GNU-stack:堆栈提示段
反汇编:
objdump -S exe(可以将C语言代码混合显示出来,前提是gcc需要加-g选项)