linux编译、链接工具:gcc, as,ld
调试工具:gdb
自动编译工具:make
void main()
{
printf("hello!\n");
return;
}
编译过程:
1. gcc hello.c -o hello
2. ./hello
反汇编过程:
1. gcc hello.c -g -o hello
2. objdump -s -d ./hello
在gcc编译时加上-g是为了添加调试信息,objdump中的-s选项是为了在显示汇编代码时同时显示原来的C语言源代码。
gcc编译选项: gcc [options] [filenames]
-c 生成目标文件.o,通常用于编译不包含主程序的子程序文件
-o 确定输出文件的名称
-g 产生符号调试工具(gdb)所必要的符号资讯,要想对源代码进行调试,就必须加上这个选项。
test.h
int iterate(int value);
test.c
int iterate(int value)
{
if(1 == value)
return 1;
return iterate(value - 1) + value;
}
hello.c
void main()
{
printf("%d\n",iterate(10));
return;
}
静态生成:
(1)首先生成*.o文件,输入 gcc -c test.c -o test.o
(2) 利用ar命令生成静态库,输入ar rc libtest.a test.o
执行文件生成:
(1) 输入gcc hello.c -o hello ./libtest.a
(2) 输入./hello,验证生成的执行文件是否正确
(3) 可以删除libtest.a文件,重新输入./hello,验证执行执行文件是否可以正常运行。
生成动态库:
gcc -shared -fPIC -o libtest.so test.c
生成可执行文件:
(1) gcc hello.c -o hello ./libtest.so
(2) ./hello
(3) 删除libtest.so,然后输入./hello,看看系统是否返回错误
使用gdb进行调试
既然需要调试,那么首先要生成包含调试信息的可执行文件
输入:gcc test.c -g -o test
调试的步骤基本如下:
(1) 首先,输入gdb test,进入gdb的调试界面;
(2) 输入list,可看到test.c源文件
(3) 输入b main,设置断点在main处
(4) 输入run,启动test程序
(5) 因为在main开始的地方设置了断点,所以程序在printf处断处,这时,可以单步跟踪,s单步可以进入函数,而n单步而越过函数
(6) 如果希望从断点处继续运行程序,输入c
(7) 希望程序运行到函数结束,输入finish
(8) 查看断点信息,输入info break
(9) 如果希望查看堆栈信息,输入bt
(10) 希望查看内存,输入x/64 + 内存地址
(11) 删除断点,则输入delete break + 断点序号
(12) 希望查看函数局部变量的数值,可以输入 print + 变量名
(13) 希望实时打印变量的数值,可以输入 display + 变量名
(14) 查看函数的汇编代码输入 diassemble + 函数名
(15) 退出调试输入 quit即可