Linux实验七

XShell7许可证过期解决办法

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

在这里插入图片描述

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值