第一周 实验与开发环境的使用
第一章 基本实验工具GCC的使用
一、程序的转换过程
说明:Linux的gcc编译驱动程序可以实现呈现的转换过程
二、gcc常用命令
- 2.1、预编译
gcc -E hello.c -o hello.i
说明:
-E,只预编译。直接输出预编译结果。
-E参数,进行预编译时,将输出信息,将程序所包含的头文件,函数,宏定义等,进行扩展。
- 2.2、编译
gcc -S hello.i -o hello.s
说明:
S,只执行到源代码到汇编代码的转换,输出汇编代码。
- 2.3、汇编
gcc -c hello.s -o hello.o
-o, 指定输出文件名 该参数可以省略。默认下(gcc sourceFile.c):生成名为a.out的可执行文件。
-c:生成名为hello.o目标文件。(进行编译,不链接)
- 2.4 链接
gcc hello.o -o hello
- 2.5 直接生成可执行目标文件
gcc hello.c -o hello
- 2.6 其他
-o0 表示编译时采用的优化级别
-m32 表示编译成×86-32位的指令
三、示例
- 3.1用gcc命令生成可执行目标文件
hello.c文件
- 3.2 文本文件和二进制文件
- 3.2.1文本文件
用ASCII码存储,文件中每一个英文字符用8位的ASCII码表示
如:hello.c、hello.i、hello.s
- 3.2.2二进制文件
用01序列存储的机器指令、数据和其他信息
如:hello.o、hello
- 3.2.3机器指令
1、计算机可识别和执行的,所以称为目标代码。
2、目标文件分为可重定位目标文件和可执行目标文件。
3、可重定位目标文件:由单个模块组成,不可以直接执行,如hello.o文件
第二章 基本实验工具Objdump的使用
Objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。
一、基本Objdump命令
※反汇编
objdump -S gdbtest.o> gdbtesto.txt
objdump -S gdbtest> gdbtest.txt
说明:
“-S”表示在反汇编后的内容加入源代码
“>” 表示将反汇编内容保存到文本文件中
二、示例
将gdbtest.c编译为可执行目标文件
对gdbtest.o和gdbtest进行反汇编
打开反汇编文件
三、反汇编文件解释说明
1、十六进制表示的机器指令
2、机器指令反汇编后的机器指令
3、机器指令存储的地址
4、可执行目标文件中指令和数据都有一个确定的地址
按照操作系统给定的存储器地址映射空间分配
不是内存的物理地址,是一个虚拟地址
第三章基本实验工具GCC的使用
一、GBD调试的基本步骤
第一步:启动GDB调试工具,加载要被调试的可执行文件
第二步:设置断点
第三步:启动并运行程序
第四步:查看程序运行时的当前状态
1、程序的当前断点
含义:反映程序执行到了哪一步,下一步要执行哪一条指令
eip寄存器:保存下一条将要执行的指令地址
指令: i r eip(或i r)
2、通用寄存器的内容
指令:i r eax ebx ecx edx(或i r)
3、存储器的单元内容
指令:x/8xb 0xffffd2bc
X/2xw 0xffffd2bc
指令说明:b:按字节显示 w:按4字节显示
“8”、“2”表示要显示的数据单元个数
“0xffffd2bc”表示要显示的存储单元起始地置
4、栈帧信息
当前栈帧字节数:y=R[ebp]-R[esp]+4
指令:
(1)当前栈帧范围: i r esp ebp //esp是栈顶指针,ebp是栈底指针
(2)显示当前栈帧内容:x/yxb $esp
x/zxw $esp //z=y/4
第五步:执行下一条指令或语句
第六步:退出调试
二、示例
反汇编代码
第一步:启动调试
第二步:在main函数处设置断点
第三步: run
//启动运行程序
第四步4: si (或s)
//执行-条指令(或c语句)
第五步: i r
//查看各寄存器的内容
第六步: i r eip
//查看eip寄存器的内容
第七步: i r esp ebp
//查看esp和ebp寄存器的内容
第八步: x/yxb $esp
//按字节显示当前栈帧内容
//y=R[ebp]-R[esp] +4
或x/zxw $esp
//按4字节显示当前栈帧内容
//z=(R[ebp]-R[esp]+ 4)/4
第九步: quit
//退出调试