一、对filename的相关操作
1、编写一个文件
vim filename.c
2、指定输出的可执行文件名为filename
gcc filename.c -o filename
3、对filename进行输出
./filename
4、使用gcc编译.c文件生成可执行文件
gcc -o filename.exe filename.c
5、生成.out(相当于windows下的.exe文件)
gcc filename.cpp -o filename.out
6、条件编译
条件编译可以在编译的时候从几组语句中选择一组编译而忽略其它组
#ifdef/#ifndef...#else...#endif
(1) 这个结构可以根据一个宏名称是否被定义过从两组语句中选择一组编译。
(2)最开始的预处理指令应该从两个里选择一个,不论选择哪个都应该在后面写一个宏名称。
(3)如果最开始的预处理指令选择#ifdef就表示后面的宏名称被定义的时候编译前一组语句,否则编译后一组语句。
(4)如果最开始的预处理指令选择#ifndef效果和#ifdef刚好相反。
如:针对#ifdef #endif对于下面这段代码:
#include<stdio.h>
int main(){
#ifdef YI
printf("YI!");
#else
printf("NO!");
#endif
return 0;
}
如果在编译的时候输入命令 gcc ifdef.c,则输出的结果为NO!
如果在编译的时候输入命令gcc -DYI ifdef.c,则输出的结果为YI!
注:gcc -D是使用gcc编译时用来定义宏的
如:针对#ifndef #endif对于下面这段代码:
#include<stdio.h>
int main(){
#ifndef YI
printf("YI!\n");
#else
printf("NO!\n");
#endif
return 0;
}
如果在编译的时候输入命令gcc -DYI ifdef.c,则输出的结果为No!
如果在编译的时候输入命令 gcc ifndef.c,则输出的结果为YI
二、对生成的filename进行汇编操作
5、使用objdump反汇编可执行文件,并将程序的反汇编输出重定向到disassembly.txt文件中。
objdump -d filename.exe > disassembly.txt
6、将.c文件生成对应的汇编.s
文件
gcc -S filename.c -o filename.s
7、查看gcc版本
gcc-v
8、在编译时关闭堆栈保护:
gcc -g filename.c -o filename -z execstack -fno-stack-protector
三、使用GDB调试器
9、编译代码时需要包含调试信息
gcc -g -o mfilename filename.c
10、打开GDB调试器
gdb filename
11、在GDB中设置断点
(gdb) break 10 # 在源代码第10行设置断点
(gdb)break main#在main函数头处设置断点
(gdb)info break#显示所有断点
12、在gdb下运行程序
(gdb) run
13、单步执行
(gdb) step # 进入函数内部
(gdb) next # 执行下一行代码,跳过函数
14、查看寄存器
(gdb) info registers #显示所有的寄存器
(gdb) p $rax #查看单个寄存器(rax)