文档视界 最新最全的文档下载
当前位置:文档视界 › homework2

homework2

homework2
homework2

《计算机系统基础》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的功能

相关文档