《计算机系统基础》Homework
HW2:排序程序的编辑、编译和调试
实验目的:熟悉开发环境、掌握开发和调试的基本过程以及工具。
实验要求:对实验步骤中给出的源程序进行编辑、编译、链接,调试。
实验报告:
1. 说明你做实验的过程(重要步骤用屏幕截图表示)。
2. 提交出源程序。
3. 提交可执行目标文件。
4. 分析或回答下列问题。
(1)分析同一个源程序在不同机器上生成的可执行目标代码是否相同。
提示:从多个方面(如ISA、OS 和编译器)来分析。
(2)你能在可执行目标文件中找出函数printf ()对应的机器代码段吗?能的话,请标示出来。(3)为什么源程序文件的内容和可执行目标文件的内容完全不同?
报告提交截止日期:5月24 日
实验步骤:
1、以下程序实现了排序和求和算法,程序源码如下图所示。请根据提供的图片输入源程序文件,并保存为相应的.c 和.h 文件。
bubblesort.h:
bubblesort.c:
add.h:
add.c:
printresult.h:
printresult.c:
main.c:
2、将源程序文件进行预处理、编译、汇编和链接,以生成可执行文件。
(1) 使用gcc 直接生成可执行文件
gcc -o main main.c bubblesort.c add.c printresult.c
(2) 首先生成可重定位目标文件(.o 文件),再链接成可执行文件。
首先,使用gcc –c ……命令将所有.c 文件编译成.o 文件(可以用-o 选项命名输出的可重定位目标文件),然后再用ld 命令进行链接,以生成可执行目标文件。
(用ld命令链接时要包含很多系统库,可以用gcc –v main.c来查看系统链接需要哪些库,把collect2 换成ld,生成的/tmp/ccBCU0rh.o 即为mian.c 编译出来的main.o 文件,删掉该句替换成以下命令:-o main main.o bubblesort.o add.o printresult.o -e main)
ld -o main main.o bubblesort.o add.o printresult.o -e main --sysroot=/ --build-id
--eh-frame-hdr -m elf_i386 --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux.so.2 -z
relro /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crti.o
/usr/lib/gcc/i686-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/4.8
-L/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu
-L/usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib
-L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/i686-linux-gnu/4.8/../../.. -lgcc
--as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/i686-linux-gnu/4.8/crtend.o
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crtn.o
上述过程如下图所示:
3、使用OBJDUMP命令进行反汇编(请自行查阅OBJDUMP命令的使用方法)
例如,可使用“objdump –S”命令进行反汇编
objdump –S main.o:将main.o进行反汇编
4、使用GDB命令进行各种调试(GDB命令参见教材附录C,也可自行查阅网上相关文档)
调试之前首先用“gcc –g”命令生成调试信息,否则调试失败。
gcc -g -o main main.c bubblesort.c add.c printresult.c
gdb main
要求用各种GDB命令对程序进行调试(例如用info registers 查看寄存器内容)。
5、选做(加分题)
实现readelf –h main.o的功能