zoukankan      html  css  js  c++  java
  • 2.3.1测试

    1.编辑并运行2.3.1中的代码,要求在不修改t2.c 和 t1.c中main函数中的代码的情况下,程序运行结果是你的后四位学号。提交代码和运行结果截图。

    修改g的值为1313,可使运行结果是我的后四位序号1316




    2.网上学习objdump命令,提交不少于5篇博客链接和微信读书上的图书链接,并给出你认为最好的讲解资源的链接或图书名及章节

    首先我先man了一下objdump命令,它的作用是反汇编目标文件或者可执行文件

    上网学习
    https://blog.csdn.net/wwchao2012/article/details/79980514?
    https://blog.csdn.net/q2519008/article/details/82349869
    https://blog.csdn.net/weixin_43092232/article/details/102764260
    https://my.oschina.net/weitao520lin/blog/3101177 (这个比较好)
    https://blog.csdn.net/whatday/article/details/99154104

    3.用objdump分析第1步中的可执行文件和目标文件,提交你的分析截图以及如何和教材讲解内容对应的,比如obj文件的文件头,代码段,数据段等,可执行文件如何链接mysum的。

    obj的文件头可以通过**objdump -h **命令来查看


    其中:
    Size: 段的大小,字节为单位
    VMA:段在虚拟地址中的位置
    LMA:段在加载地址中的位置
    File off:File offset,段的起始位置
    Algn:字节对齐方式,2**2表示2的平方即为4,2**3表示2的3次方即为8

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

    对照书上的讲解初步分析一下mysum函数

    这是函数的入口代码

    这是函数的函数体代码

    这是函数的退出代码

    4.我的具体分析

    编译器编译源代码后生成的文件叫做目标文件,目标文件的文件类型为ELF,在Linux下对应文件后缀为.o的文件,Window下对应文件后缀为.obj的文件。使用file命令可以查看到.o和.obj文件均为ELF类型。ELF文件存放数据的格式是固定的,计算机在解析目标文件时,就是按照它每个字段的数据结构进行逐字解析的。ELF文件结构信息定义在/usr/include/elf.h中,整个ELF文件的结构如下图:

    首先看ELF Header

    使用readelf -h t1.o来进行对Header的解析。Header中主要存放的是一些基本信息,通过Header中的信息,我们可以确定后面其他字段的大小和起始地址,通常比较关心的部分是:ELF文件类型、是32bit还是64bit、Header部分大小、Section部分大小和拥有Section的个数等。

    再看Section

    Section部分主要存放的是机器指令代码和数据,执行命令readelf -S -W t1.o同样可以查看对Section部分的解析。对于这部分内容,重点是.text(存放代码)、.data(存放全局静态变量和局部静态变量)和.bss(存未初始化的全局变量和局部静态变量)。命令objdump -h可以查看每个段的大小

    对于t1.c这个代码
    放在.data段

    放在.bss段

    除了static int c=3外放在.text段

    来看代码段

    执行命令objdump -s -d t1.o对代码段(.text)的解析结果如下:

    可以用命令objdump -h看到.text的偏移量为56字节,与objdump -s看到的是相符的

    来看BSS段

    执行命令objdump -x -s -d t1.o打印出目标文件的符号表,通过符号表我们可以知道各个变量的存放位置,只有未初始化的局部静态变量s被放到了.bss段,而c被放入了.data段,h
    被放入了comment段

    关于可执行文件如何链接mysum

    可以看到call函数链接了mysum的地址

  • 相关阅读:
    sql中not exists的用法
    jsp中target="_blank"的用法
    jsp 运用 session 登录输出
    jsp留言板
    编写JSP 实现用户登录并判断用户或密码
    jsp打印九九乘法表
    jsp输出当前时间
    jsp输出金字塔
    jsp输出5的阶乘
    jdbc练习3
  • 原文地址:https://www.cnblogs.com/ffffatal/p/15463350.html
Copyright © 2011-2022 走看看