一:执行前设置字符串
#include stdio.h //此程序很简单,只打印一个Hello World字符串。 intmain(void ) printf (帮助世界! n '; 返回0; }预处理的基本操作
1 .删除所有#define,展开所有宏定义,并处理所有条件预编译指令,如#if #ifdef #elif #else #endif。
处理#include预编译命令,并将包含的文件插入该预编译命令的位置。
3 .删除所有评论"//"和"//*//"。
4 .添加行号和文件标识符,以便在编译时生成调试行号和编译错误警告行号。
5 .必须保留所有#pragma编译器指令,并在后续编译过程中使用。
编译执行:
程序集:将编译生成的hello.s文件汇编为所需的文件hello.o
GCC选项-c在组件运行后停止GCC并生成所需的文件
ELF文件分析
链接器链接后,最终文件将成为ELF格式的可执行文件。 一个ELF可执行文件通常链接到不同的段,并成为常见的段,如. text、 data、 rodata和. bss
. text :已编译程序的指令代码段。
. rodata:ro表示只读,即只读数据。 例如,常量const。
. data :初始化的c程序全局变量和静态局部变量。
. bss :未初始化的c程序全局变量和静态局部变量。
. debug :调试符号表,调试器对调试非常有用。
反汇编ELF
Gcc基本操作:
1 .预处理:
gcc -E test.c -o test.i或gcc -E test.c
gcc的-E选项允许编译器在预处理后停止并输出预处理结果
2 .编译成汇编代码
gcc -S test.i -o test.s
gcc的-S选项表示在编译程序期间生成程序集代码后,-o将停止输出程序集代码文件。
3 .汇编
gcc -c test.s -o test.o
4 .链接
gcc连接器由gas提供,负责连接程序的目标文件和所有必需的附件目标文件,并最终生成可执行文件。 附加的目标文件包括静态连接库和动态连接库。
gcc test.o -o test