zoukankan      html  css  js  c++  java
  • 20191323王予涵2.3.1测试

    20191323王予涵2.3.1测试

    任务详情

    1. 推荐在OpenEuler系统中实现
    2. 编辑并运行2.3.1中的代码,要求在不修改t2.c 和 t1.c中main函数中的代码的情况下,程序运行结果是你的后四位学号。提交代码和运行结果截图。
    3. 网上学习objdump命令,提交不少于5篇博客链接和微信读书上的图书链接,并给出你认为最好的讲解资源的链接或图书名及章节
    4. 用objdump分析第1步中的可执行文件和目标文件,提交你的分析截图以及如何和教材讲解内容对应的,比如obj文件的文件头,代码段,数据段等,可执行文件如何链接mysum的。

    0、测试环境

    openeuler(wsl):

    1、运行结果为学号

    1. 使用gdb调试
    2. 在line12处打断点
    3. 使用print c=1323将变量c的值修改为1323
    4. 输出

    2、学习objdump命令

    博客:

    3、分析目标文件和可执行文件

    目标文件(t1.o为例):

    t1.c

    #include <stdio.h>
    int g = 100;
    int h;
    static int s;
    int mysum(int x, int y);
    int main(int argc, char *argv[]){
    	int a =1;
    	int b;
    	static int c = 3;
    	b = 2;
    	c = mysum(a,b);
    	printf("sum=%d
    ", c);
    	return 0;
    }
    

    文件头

     objdump -h bin/t1.o
    

    • text(代码段):已编译程序的机器代码
    • rodata:只读数据,比如printf语句中的格式串和开关(switch)语句的跳转表
    • data(数据段):已初始化的全局C变量。局部C变量在运行时被保存在栈中,既不出现在.data中,也不出现在.bss节中
    • bss:未初始化的全局C变量。在目标文件中这个节不占据实际的空间,它仅仅是一个占位符。目标文件格式区分初始化和未初始化变量是为了空间效率在:在目标文件中,未初始化变量不需要占据任何实际的磁盘空间

    代码段

    推送参数并保存现场:

    调用函数:

    捕获返回值,并恢复现场:

    数据段

    符号表:

    可以看到非静态全局变量、函数名称和属性

    可执行文件链接mysum:

    启动代码(crt0.o):

    调用main

    整合t1.o和t2.o中的data段为单一data段:

    整合整合t1.o和t2.o中的bss段为单一bss段:

    用t1.o和t2.o中的重定位信息调整偏移量

    替换所有预留调用地址:

    完成链接,生成可执行文件

  • 相关阅读:
    elasticsearch api
    kaili camera
    mysql create db utf8 character
    npm run-script
    d-link kvm 关闭声音
    setInterval js
    jpa datasource config
    mvn添加本地jar
    Sublime Text 2 中文包
    初遇ping++
  • 原文地址:https://www.cnblogs.com/WANGYUHAN/p/15487249.html
Copyright © 2011-2022 走看看