前言
本文将介绍与 GNU GCC、GDB 和 objdump 工具使用的实验二。
GNU GCC,原名为 GNU C 语言编译器,因为它原本只能处理 C 语言,后变得可以处理更多的编程语言,许多操作系统如 Linux 及 BSD 家族都采用 GCC 作为标准编译器。
GDB 是 GNU debugger 的缩写,是 GNU 软件系统中的标准调试器,而 objdump 是在类 Unix 操作系统上显示关于目标文件的各种信息的命令行程序。这两个工具都可以用于反向工程。
上述三个工具中,第一个工具要求学生理解 GNU GCC 的基本使用方法,后两个工具则在 CS:APP 的第三章有所提及,是完成实验三的基础。因此将实验二设置为学习工具的使用,是为后面进行实验打下基础。
介绍
本实验需要学生完成一系列步骤,以此熟悉上述三个工具的使用,包括编写 C 语言的函数、使用 GCC 进行编译、通过 GDB 和 objdump 找到存放在内存中的 char 数组位置等。
树莓派支持的是 Linux/ARM 平台,但本实验是在 Linux/x86-64 平台上完善的,其汇编语言及可执行文件代码可能存在不同,所以本文将主要介绍 C 语言的内容。
文件内容
- main.c:实验二 main 方法所在文件
- support.c:学生需要编写的函数所在位置
- support.h:头文件,无需修改
- README:实验指导书实验二部分节选
具体内容
实验题目有 3 道:
- 修改 support.c 文件,编写计算阶乘的函数 add_up
- 修改 main.c 文件,使其可以顺利使用 GCC 进行编译
- 使用 GDB 在内存中找到 char 数组 str 的位置
其中 main 方法可以为我们对实验二管中窥豹。
int main() {
int init = 8;
int rst = add_up(init);
printf(str, rst);
return 0;
}
实验过程简介
学生首先需要修改在 support.c 文件中函数 add_up 的函数体:
int add_up(int n) {
return n;
}
在上述文件中,并未引入 support.h 作为头文件,学生需要手动将其引入,否则编译时会报错,与此相同的还有 main.c 文件。
当学生使用 GCC 编译完成后,需要通过 objdump 找到 char 数组 str 的地址,然后使用 GDB 调试,找到对应的内存位置即可。这个过程比较重要,因为该步骤会在实验三中反复使用。
更具体的实验过程将会在实验二的实验指导书中详细给出。
实验编写简介
这个实验是在下一个实验「顽皮锁」完成后才加上的,目的是降低每个实验的难度,当然更多是让我首先理解了相关内容,这才方便出实验题。
|