理论
在使用 GCC (GNU Compiler Collection) 进行 C 或 C++ 程序的编译时,可以将整个过程分为四个主要阶段:预处理、编译、汇编和链接。下面是每个阶段的命令示例:
1. 预处理-E
预处理阶段会处理所有的预处理指令(如 #include
和 #define
),并生成一个中间文件。
gcc -E source.c -o source.i
2. 编译-S
编译阶段将预处理后的源代码转换为汇编语言。
gcc -S source.i -o source.s
3. 汇编-c
汇编阶段将汇编代码转换为机器代码,生成目标文件。
gcc -c source.s -o source.o
4. 链接
链接阶段将目标文件和所需的库链接在一起,生成可执行文件。
gcc source.o -o executable
综合命令
也可以使用一个简单的命令来完成所有步骤:
gcc source.c -o executable
这个命令会自动执行预处理、编译、汇编和链接。
选项说明
-E
:仅进行预处理。-S
:生成汇编代码。-c
:生成目标文件而不进行链接。-o
:指定输出文件名。
这些命令可以根据需要进行组合和扩展,以适应不同的编译需求。
实验
~/Desktop/makefile-learning$ mkdir 01-Helloworld
~/Desktop/makefile-learning$ cd 01-Helloworld/
~/Desktop/makefile-learning/01-Helloworld$ code main.c
~/Desktop/makefile-learning/01-Helloworld$ gcc -E main.c -o main.i
~/Desktop/makefile-learning/01-Helloworld$ gcc -S main.i -o main.s
~/Desktop/makefile-learning/01-Helloworld$ gcc -c main.s -o main.o
~/Desktop/makefile-learning/01-Helloworld$ gcc main.o -o main
~/Desktop/makefile-learning/01-Helloworld$ ./main
Hello world
反汇编
反汇编是将机器代码转换回汇编语言的过程。使用 objdump
工具可以轻松完成这一操作。以下是一些基本的步骤和命令来反汇编可执行文件或目标文件。
使用 objdump
反汇编
-
反汇编整个可执行文件:
objdump -d my_program
-
反汇编特定的目标文件:
objdump -d my_program.o
实验
~/Desktop/makefile-learning/01-Helloworld$ objdump -d main
这里是直接在控制台输出了,也可以用>命令写入指定文件:
objdump -d main > main.objdump.txt
反汇编.o文件:
~/Desktop/makefile-learning/01-Helloworld$ objdump -d main.o