1、 C程序 sum.c 源代码如下:
#include<stdio.h>
int sum(int num)
{
int i;
int sum =0;
for(i = 1; i <= num; i++){
sum += i;
}
return sum;
}
int main()
{
int num, result;
result = 0;
printf("Input a number:");
scanf("%d", &num);
result = sum(num);
printf("the sum of %d is %d\n", num, result);
return 0;
}
要求:
使⽤gcc -E sum.c -o sum.i ⽣成预处理⽂件,观察在本⽬录中⽣成的sum.i⽂件;
使⽤gcc -S sum.c -o sum.s ⽣成汇编⽂件,观察在本⽬录中⽣成的sum.s⽂件;
使⽤gcc -c sum.c -o sum.o ⽣成⽬标⽂件,观察在本⽬录中⽣成的sum.o⽂件;
使⽤gcc sum.c -o sum⽣成可执⾏⽂件,观察在本⽬录中⽣成的sum⽂件。
[root@localhost mygcc]# ls
sum.c
[root@localhost mygcc]# gcc -E sum.c -o sum.i
[root@localhost mygcc]# ls
sum.c sum.i
[root@localhost mygcc]# gcc -S sum.c -o sum.s
[root@localhost mygcc]# ls
sum.c sum.i sum.s
[root@localhost mygcc]# gcc -c sum.c -o sum.o
[root@localhost mygcc]# ls
sum.c sum.i sum.o sum.s
[root@localhost mygcc]# gcc sum.c -o sum
[root@localhost mygcc]# ls
sum sum.c sum.i sum.o sum.s
#vim或vi编辑器下查找某字符串:
:/字符串
sum.i 文件部分内容:
········
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 943 "/usr/include/stdio.h" 3 4
# 2 "sum.c" 2
int sum(int num)
{
int i;
int sum =0;
for(i = 1; i <= num; i++){
sum += i;
}
return sum;
}
int main()
{
int num, result;
result = 0;
printf("Input a number:");
scanf("%d", &num);
result = sum(num);
printf("the sum of %d is %d\n", num, result);
return 0;
}
sum.s 文件内容:
.file "sum.c"
.text
.globl sum
.type sum, @function
sum:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -20(%rbp)
movl $0, -8(%rbp)
movl $1, -4(%rbp)
jmp .L2
.L3:
movl -4(%rbp), %eax
addl %eax, -8(%rbp)
addl $1, -4(%rbp)
.L2:
movl -4(%rbp), %eax
cmpl -20(%rbp), %eax
jle .L3
movl -8(%rbp), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size sum, .-sum
.section .rodata
.LC0:
.string "Input a number:"
.LC1:
.string "%d"
.LC2:
.string "the sum of %d is %d\n"
.text
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -4(%rbp)
movl $.LC0, %edi
movl $0, %eax
call printf
leaq -8(%rbp), %rax
movq %rax, %rsi
movl $.LC1, %edi
movl $0, %eax
call __isoc99_scanf
movl -8(%rbp), %eax
movl %eax, %edi
call sum
movl %eax, -4(%rbp)
movl -8(%rbp), %eax
movl -4(%rbp), %edx
movl %eax, %esi
movl $.LC2, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)"
.section .note.GNU-stack,"",@progbits
sum.o 文件内容:无法查看,乱码
目标代码并不能在CPU上运行,但它离二进制可执行文件已经很近了,再输入以下编译指令即可生成二进制可执行文件
2、 gdb⼯具使⽤
1. 利⽤ -g选项对 sum.c ⽂件进⾏编译,⽣成可调试的⼆进制⽂件 sum_g;
2. 打开gdb⼯具,并加载sum_g⽂件;
3. 打印sum_g ⽂件的源代码列表,并在第7⾏和第17⾏设置断点;
4. 运⾏程序,停在17⾏的断点处,通过单步执⾏(进⼊函数)的⽅式进⼊sum函数;
5. 继续运⾏程序,直到在第7⾏断点处停⽌;
6. 打印当前变量sum的值;
7. 单步执⾏到下⼀次断点停⽌处,打印当前变量i的值;
8. 继续执⾏代码,直到程序结束。
[root@localhost mygcc]# gcc -g sum.c -o sum_g
[root@localhost mygcc]# gdb sum_g
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/mygcc/sum_g...done.
(gdb) break 7
Breakpoint 1 at 0x4005a4: file sum.c, line 7.
(gdb) break 17
Breakpoint 2 at 0x4005ef: file sum.c, line 17.
(gdb) list
5 int sum =0;
6 for(i = 1; i <= num; i++){
7 sum += i;
8 }
9 return sum;
10 }
11 int main()
12 {
13 int num, result;
14 result = 0;
(gdb) run
Starting program: /root/mygcc/sum_g
Input a number:4
Breakpoint 2, main () at sum.c:17
17 result = sum(num);
Missing separate debuginfos, use: debuginfo-install glibc-2.17-325.el7_9.x86_64
(gdb) step
sum (num=4) at sum.c:5
5 int sum =0;
(gdb) step
6 for(i = 1; i <= num; i++){
(gdb) step
Breakpoint 1, sum (num=4) at sum.c:7
7 sum += i;
(gdb) print sum
$1 = 0
(gdb) step
6 for(i = 1; i <= num; i++){
(gdb) step
Breakpoint 1, sum (num=4) at sum.c:7
7 sum += i;
(gdb) print i
$2 = 2
(gdb) step
6 for(i = 1; i <= num; i++){
(gdb) step
Breakpoint 1, sum (num=4) at sum.c:7
7 sum += i;
(gdb) step
6 for(i = 1; i <= num; i++){
#然后一直step
3、 根据以下项⽬⽂件结构,编写对应的makefile ⽂件内容,并画出makefile的依赖关系图。现有⼀个程序由以下5个⽂件组成:
提交内容:⽤⼀个word⽂件把makefile⽂件内容和层次图画出来。最后提交word文件。
makefile文件:
main :main.o mytool1.o mytool2.o
gcc main.o mytool1.o mytool2.o -o main
mytool1.o:tool1/mytool1.c
gcc -c tool1/mytool1.c -o mytool1.o -I tool1
mytool2.o:tool2/mytool2.c
gcc -c tool2/mytool2.c -o mytool2.o -I tool2
main.o:main.c
gcc -c main.c -o main.o -I tool1 -I tool2